首先,創建一個mvc項目(包含webapi),我們模擬一個場景
1)在項目的Controller 創建一個WeiXinApiController
public class WeiXinApiController : ApiController
{
WeiXinApiService service = new WeiXinApiService();
[System.Web.Http.HttpGet]
public string GetCultureLevel()
{
//獲取文化程度的方法
AppResult result = service.GetCultureLevel();
//返回json格式
return JsonConvert.SerializeObject(result,Newtonsoft.Json.Formatting.Indented);
}
}
2) 在項目的Model中創建一個WeixinApiService的業務類
public class WeiXinApiService
{
public dynamic GetCultureLevel() {
//定義一個key/value的集合
Dictionary<int, string> dicts = new Dictionary<int, string>();
dicts[1] = "初中";
dicts[2] = "高中";
dicts[3] = "中專";
dicts[4] = "大專";
dicts[5] = "本科";
dicts[6] = "碩士";
dicts[7] = "博士";
//聲明返回的數據類
AppResult result = new AppResult();
try
{
dynamic list = dicts;
if (list.Count > 0)
{
result.Success = true;
result.Message = "返回成功";
result.Data = list;
}
else
{
result.Success = false;
result.Message = "返回失敗";
}
}
catch (Exception ex)
{
result.Success = false;
result.Message = ex.Message;
}
return result;
}
}
3)在項目新建一個文件夾Common,創建一個AppResult類(返回數據類)
public class AppResult
{
public AppResult()
{
}
public AppResult(bool bo, string msg)
{
_Success = bo;
Message = msg;
}
private bool _Success = false;
/// <summary>
/// 調用是否成功
/// </summary>
public bool Success
{
get { return _Success; }
set { _Success = value; }
}
/// <summary>
/// 返回的信息
/// </summary>
public string Message { get; set; }
/// <summary>
/// 返回數據
/// </summary>
public object Data { get; set; }
}
4)運行起來,用瀏覽器訪問對應api控制器方法,是可以調用返回數據的
注:http://localhost:29303/api/Weixinapi/GetCultureLevel 路徑是我本地項目路徑
5)用外部調用這個api方法時,就會出現跨域訪問問題(調用時,保持項目是運行的)
我們用DW測試,引用一個jquery.min.js文件,調用jquery的ajax請求方法進行請求
html頁面
<body> <input type="button" value="調用測試" onClick="Test()"/> </body>
js 方法
<script type="text/javascript" src="jquery.min.js"></script>
<script type="text/javascript">
var Test = function(){
$.ajax({
type: 'GET',
url: 'http://localhost:29303/api/Weixinapi/GetCultureLevel',
asyuc: true,
jsonp: 'jsoncallback',
success: function (datalist) {
//將數據轉化為json格式
var dt = JSON.parse(datalist);
//判斷是否返回成功
if (dt.Success) {
console.log(dt);
}
else{
console.log(dt.Message);
}
}
});
}
</script>
出現跨域問題
那么如何解決跨域請求的問題呢?我在網上找到解決方法(添加支持跨域請求的屬性)
6)在項目添加文件夾Attributes,新建一個CrossSiteAttribute.cs類
/// <summary>
/// 控制Api接口是否支持跨域調用
/// </summary>
public class CrossSiteAttribute : System.Web.Http.Filters.ActionFilterAttribute
{
private const string Origin = "Origin";
/// <summary>
/// Access-Control-Allow-Origin是HTML5中定義的一種服務器端返回Response header,用來解決資源(比如字體)的跨域權限問題。
/// </summary>
private const string AccessControlAllowOrigin = "Access-Control-Allow-Origin";
/// <summary>
/// originHeaderdefault的值可以使 URL 或 *,如果是 URL 則只會允許來自該 URL 的請求,* 則允許任何域的請求
/// </summary>
private const string originHeaderdefault = "*";//"http://192.168.13.7:8002";
/// <summary>
/// 該方法允許api支持跨域調用
/// </summary>
/// <param name="actionExecutedContext"> 初始化 System.Web.Http.Filters.HttpActionExecutedContext 類的新實例。</param>
public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
{
actionExecutedContext.Response.Headers.Add(AccessControlAllowOrigin, originHeaderdefault);
}
}
7)在原先api控制器的方法前加上這個屬性
public class WeiXinApiController : ApiController
{
WeiXinApiService service = new WeiXinApiService();
[System.Web.Http.HttpGet]
[CrossSiteAttribute]
public string GetCultureLevel()
{
//獲取文化程度的方法
AppResult result = service.GetCultureLevel();
//返回json格式
return JsonConvert.SerializeObject(result,Newtonsoft.Json.Formatting.Indented);
}
}
8)再次運行項目,用外部調用

