博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ASP.NET Web API 跨域访问(CORS)要注意的地方
阅读量:5981 次
发布时间:2019-06-20

本文共 2167 字,大约阅读时间需要 7 分钟。

一、客户端用JSONP请求数据

 

如果你想用JSONP来获得跨域的数据,WebAPI本身是不支持javascript的callback的,它返回的JSON是这样的:

{
"YourSignature": "嫁人要嫁程序员,钱多话少死得早"}

然而,JSONP请求期望得到这样的JSON:

jQuery123456({
"YourSignature": "嫁人要嫁程序员,钱多话少死得早"})

所以我们需要对WebAPI做拓展,让它支持这样的callback。我找到了两种办法。

自己写个Attribute,来给返回的JSON包上callback

 

public class JsonCallbackAttribute : ActionFilterAttribute{    private const string CallbackQueryParameter = "callback";    public override void OnActionExecuted(HttpActionExecutedContext context)    {        var callback = string.Empty;        if (IsJsonp(out callback))        {            var jsonBuilder = new StringBuilder(callback);            jsonBuilder.AppendFormat("({0})", context.Response.Content.ReadAsStringAsync().Result);            context.Response.Content = new StringContent(jsonBuilder.ToString());        }        base.OnActionExecuted(context);    }    private bool IsJsonp(out string callback)    {        callback = HttpContext.Current.Request.QueryString[CallbackQueryParameter];        return !string.IsNullOrEmpty(callback);    }}

 

然后在要被调用的方法前加上这个Attribute:

[JsonCallback]        [HttpGet]        public HttpResponseMessage a()        {            string strJson = "{\"info\" : \"true\"}";            var result = new HttpResponseMessage(HttpStatusCode.OK)            {                Content = new StringContent(strJson, Encoding.UTF8, "text/plain")            };            return result;        }

 

非常简洁明了,但是这种方法有个缺点,就是被加了[JsonCallback]的方法,只能适用于JSONP的请求。如果你希望API能被各种场合的客户端调用,还是在服务端提供支持吧。

2. 通过自定义JsonMediaTypeFormatter实现

 

参见 Artech大神的文章:

蒋大神的文章的JsonpMediaTypeFormatter类只适合将对象传过去进行json序列化,有点弊端

 

支持CORS最地道的方法当然是在服务端提供支持,按官网的办法,100%成功。

 

主要步骤是:

1. 到nuget上装一个包:

2. 在WebApiConfig.Register方法中加入代码:

config.EnableCors();

3. 在Controller上加上Attribute:

[EnableCors(origins: "http://myclient.azurewebsites.net", headers: "*", methods: "*")]

这个域名是可以配置的,具体还请参考上面给出的官网教程。

最后,还要告诉大家一个坑,在服务端完提供支持以后,不要高兴的太早,如果你用jQuery.ajax()的方式去请求,还是会爆的:

$.ajax({    url: 'yourCORSurl',    data: '',    dataType: 'json',    type: 'GET',    contentType: 'application/json; charset=utf-8',    ...})

经过无数次爆破,终于发现,只要把dataType和contentType两个参数去掉,就肯定不会爆了!!!

转载于:https://www.cnblogs.com/tinya/p/4618062.html

你可能感兴趣的文章
[leetcode]Convert Sorted Array to Binary Search Tree
查看>>
MATLAB求实数绝对值——abs
查看>>
关于yii验证和yii错误处理
查看>>
.NET P2P: Writing Peer-to-Peer Networked Apps with the Microsoft .NET Framework
查看>>
Java 编程下 HashSet 存入相同元素的原理
查看>>
重温C#基础
查看>>
找房 -- 爱合住, ihezhu.com
查看>>
c++ template(6)模板术语
查看>>
10套华丽的 Windows 8 Metro 风格图标【2000+免费图标】
查看>>
Win8:最好用的开始菜单 StartIsBack 2.0.2 Multilingual Crack
查看>>
【20130321】sql server 2005 之后 文件状态变为了7,DEFUNCT(僵死状态)
查看>>
IP address of device using phone as access point
查看>>
3、单机运行环境搭建之 --CentOS-6.5安装配置Tengine
查看>>
.NET平台下几种SOCKET模型的简要性能供参考(转)
查看>>
memcmp和strncmp函数
查看>>
linux下apache字符集问题
查看>>
Deep learning:二十六(Sparse coding简单理解)
查看>>
C#中使用cookies
查看>>
认证、证书-【2013Esri开发者大会精彩看点】ArcGIS 10.2 for Server支持新的验证方式—PKI-by小雨...
查看>>
AutoIt自动化编程(1)
查看>>