ASP.NET MVC 實現AJAX跨域請求的兩種方法javascript
一般發送AJAX請求都是在本域內完成的,也就是向本域內的某個URL發送請求,完成部分頁面的刷新。但有的時候須要向其它域發送AJAX請求,完成數據的加載,例如Google。html
在ASP.net MVC 框架裏實現跨域的AJAX請求有幾種方式能夠實現,如下就介紹經常使用的兩種方法。java
1. 發送JSONP請求jquery
客戶端:ajax
jQuery對發送JSONP請求有很好的支持,客戶端經過. ajax() 函數發送請求,其中須要制定 dataType 爲「jsonp」 jsonpCallback 爲指定的回調函數名(如 「UpdateDiv」),也就是客戶端須要定義一個UpdateDiv 函數,當請求成功後會自動調用該函數。json
服務器:跨域
ASP.Net MVC沒有內置對 JSONP 請求的支持,不過使用 JsonResult 能夠很方便的實現。咱們只須要定義一個類(如 JsonpResult)繼承自JsonResult,並重寫 ExecuteResult()方法,在輸出數據時,調用客戶端定義的那個回調函數(這個函數必須是存在的,而且必須是全局和惟一的)。須要注意的是,在自定義的JsonpResult 裏,須要設置 JsonRequestBehavior 爲 AllowGet,不然會出錯,由於 JSONP 請求必須是 Get 方式提交的。服務器
代碼:框架
客戶端:ide
<scripttype="text/JavaScript">
functionUpdateDiv(result) {
$("#div1").html(result.ID +result.Name);
}
$(function() {
$(".btn").click(function () {
$.ajax({
type: "GET",
url:"http://localhost:50863/Home/Index2", //跨域url
dataType: "jsonp", //指定 jsonp 請求
jsonpCallback: "UpdateDiv" // 指定回調函數
});
})
})
</script>
服務端:
public class JSONPResult :JsonResult
{
public JSONPResult()
{
JsonRequestBehavior=JsonRequestBehavior.AllowGet;
}
public string Callback{get;set;}
///<summary>
///對操做結果進行處理
///</summary>
///<paramname="context"></param>
public override void ExecuteResult(ControllerContext context)
{
var httpContext = context.HttpContext;
var callBack = Callback;
if(string.IsNullOrWhiteSpace(callBack))
callBack = httpContext.Request["callback"]; //得到客戶端提交的回調函數名稱
// 返回客戶端定義的回調函數
httpContext.Response.Write(callBack +"(");
httpContext.Response.Write(Data); //Data 是服務器返回的數據
httpContext.Response.Write(");"); //將函數輸出給客戶端,由客戶端執行
}
}
//操做器和其它操做沒什麼區別,只是返回值是JsopnpResult結果
public ActionResult Index2()
{
var str = "{ID :'123', Name : 'asdsa' }";
return new JSONPResult{Data = str }; //返回 jsonp 數據,輸出回調函數
}
2. 跨域資源共享
相比 JSONP 請求,跨域資源共享要簡單許多,也是實現跨域 AJAX 請求的首選。
客戶端:
客戶端不在發送 JSONP 類型的請求,只須要發送普通的 JSON 請求便可,也不用定義回調函數,用 .success 便可。
服務端:
服務端也很簡單,操做結果仍是返回普通的操做結果就能夠,惟一要指定的是 HTTP 報文頭部的Access-Control-Allow-Origi
指定爲 「*」 便可,表示該輸出容許跨域實現。
跨域資源共享能夠很方便的實現,不過在 IE9 尚未對該技術的支持,FireFox 就已經支持了。
代碼:
客戶端:
<scripttype="text/javascript">
$(function() {
$(".btn").click(function (){
$.ajax({
type:"GET",
url:"http://localhost:50863/Home/Index3", //跨域URL
dataType:"json",
success:function (result){
$("#div1").html(result.ID +result.Name);
},
error:function (XMLHttpRequest, textStatus,errorThrown) {
alert(errorThrown); // 調用本次AJAX請求時傳遞的options參數
}
});
})
})
</script>
服務端:
///<summary>
///跨站資源共享實現跨站AJAX請求
///</summary>
///<returns></returns>
public ActionResult Index3()
{
var str = new { ID="123", Name= "asdsa" };
HttpContext.Response.AppendHeader("Access-Control-Allow-Origin","*");
return Json(str, JsonRequestBehavior.AllowGet);
}
感謝做者
原文地址:http://blog.csdn.net/skyandcode/article/details/12524673