一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

ASP.NET MVC 定義JsonpResult實現(xiàn)跨域請求

 昵稱10504424 2015-08-26

1:原理

在js中,XMLHttpRequest是不能請求不同域的數(shù)據(jù),但是script標(biāo)簽卻可以,所以可以用script標(biāo)簽實現(xiàn)跨域請求。具體是定義一個函數(shù),例如jsonp1234,請求不同域的url時帶上函數(shù)名,例如:http:///index?callback=jsonp1234,然后服務(wù)端根據(jù)callback獲取這個函數(shù)名,然后傳入json字符串作為函數(shù)參數(shù)。

2:實現(xiàn)

http://localhost:62203/home/index頁面代碼如下

復(fù)制代碼
@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
    <script>
    function showMessage(result) {
        alert(result.name)
    }
    </script>
    <script src="http://localhost:16308/home/index?callback=showMessage" type="text/javascript"></script>
</head>
<body>
    <div> 
    </div>
</body>
</html>
復(fù)制代碼

主要是這句  

<script src="http://localhost:16308/home/index?callback=showMessage" type="text/javascript"></script>,

可以看到,訪問的是不同的站點,并且callback的參數(shù)值為showMessage,

http://localhost:16308/home/index代碼如下

復(fù)制代碼
public ActionResult Index()
        {
            string callback = this.Request["callback"];
            string json="{\"name\":\"server\"}";
            this.Response.Write(callback + "(" + json + ")");
            return new EmptyResult();
        }
復(fù)制代碼

根據(jù)callback獲取函數(shù)名,然后將json字符串作為函數(shù)參數(shù)。

訪問頁面http://localhost:62203/home/index,效果如下

image

可見,站點localhost:62203從站點localhost:16308獲取到了數(shù)據(jù)。

但是我們看服務(wù)端的實現(xiàn),這也太不美觀,也比較麻煩。

復(fù)制代碼
public ActionResult Index()
        {
            string callback = this.Request["callback"];
            string json="{\"name\":\"server\"}";
            this.Response.Write(callback + "(" + json + ")");
            return new EmptyResult();
        }
復(fù)制代碼

我們想要的是調(diào)用一個方法,就能實現(xiàn)跨域了,那如何實現(xiàn)呢??吹紺ontroller有個this.Json 方法,類型是JsonResult,我們可以參考這個類。定義一個類JsonpResult,派生于JsonResult,在ExecuteResult 方法根據(jù)callback獲取函數(shù)名,然后傳入json字符串作為函數(shù)參數(shù)。

復(fù)制代碼
public class JsonpResult : JsonResult
    {
        public static readonly string JsonpCallbackName = "callback";
        public static readonly string CallbackApplicationType = "application/json";

        public override void ExecuteResult(ControllerContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException("context");
            }
            if ((JsonRequestBehavior == JsonRequestBehavior.DenyGet) &&
                  String.Equals(context.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase))
            {
                throw new InvalidOperationException();
            }
            var response = context.HttpContext.Response;
            if (!String.IsNullOrEmpty(ContentType))
                response.ContentType = ContentType;
            else
                response.ContentType = CallbackApplicationType;
            if (ContentEncoding != null)
                response.ContentEncoding = this.ContentEncoding;
            if (Data != null)
            {
                String buffer;
                var request = context.HttpContext.Request;
                var serializer = new JavaScriptSerializer();
                if (request[JsonpCallbackName] != null)
                    buffer = String.Format("{0}({1})", request[JsonpCallbackName], serializer.Serialize(Data));//首先根據(jù)callback獲取獲取函數(shù)名,然后傳入json字符串作為函數(shù)參數(shù)
                else
                    buffer = serializer.Serialize(Data);
                response.Write(buffer);
            }
        }
    }
復(fù)制代碼

JsonpResult類有了,但是想在Controller這樣使用this.Jsonp,所以為Controller類定義一個擴(kuò)展方法,

復(fù)制代碼
public static class ControllerExtension
    {
        public static JsonpResult Jsonp(this Controller controller, object data)
        {
            JsonpResult result = new JsonpResult()
            {
                Data = data,
                JsonRequestBehavior = JsonRequestBehavior.AllowGet
            }; 
            return result;
        }
    }
復(fù)制代碼

這是在Controller就可以直接使用this.Jsonp了,把跨域服務(wù)端的代碼改下
public ActionResult Index()
        {
            return this.Jsonp(new { name = "server JsonpResult" });
        }

相比上面那個簡潔多了

再次打開http://localhost:62203/home/index

image

同樣,站點localhost:62203從站點localhost:16308獲取到了數(shù)據(jù),和上面的一樣

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    草草视频精品在线观看| 欧美人妻少妇精品久久性色| 欧美胖熟妇一区二区三区| 亚洲精品成人午夜久久| 亚洲中文字幕亲近伦片| 亚洲一级在线免费观看| 成人精品日韩专区在线观看| 免费人妻精品一区二区三区久久久| 亚洲欧美日韩综合在线成成| 日韩一区二区三区在线日| 国产成人精品在线播放| 国产日韩欧美在线播放| 日韩中文字幕人妻精品| 麻豆剧果冻传媒一二三区| 国产精品自拍杆香蕉视频| 欧美日韩国产二三四区| 国产午夜精品亚洲精品国产| 国产精品成人一区二区在线| 激情内射亚洲一区二区三区| 国产一区二区熟女精品免费| 91欧美视频在线观看免费| 亚洲中文字幕在线乱码av| 在线观看视频日韩精品| 亚洲中文字幕视频在线观看| 日本不卡一本二本三区| 色婷婷视频国产一区视频| 男人和女人黄 色大片| 91后入中出内射在线| 人妻一区二区三区在线| 久久精品a毛片看国产成人| 国产精品午夜小视频观看| 国产日产欧美精品视频| 色婷婷人妻av毛片一区二区三区| 国产又猛又黄又粗又爽无遮挡| 日本东京热视频一区二区三区| 丰满人妻熟妇乱又伦精另类视频| 在线精品首页中文字幕亚洲| 亚洲欧美日韩另类第一页| 国产欧美另类激情久久久| 国产美女精品午夜福利视频| 国产精品一区二区不卡中文|