ASP.NET Web API 跨域访问(CORS)要注意的地方
一、客户端用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大神的文章:http://www.cnblogs.com/artech/p/cors-4-asp-net-web-api-03.html
蒋大神的文章的JsonpMediaTypeFormatter类只适合将对象传过去进行json序列化,有点弊端
支持CORS最地道的方法当然是在服务端提供支持,按官网的办法,100%成功。http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api
主要步骤是:
1. 到nuget上装一个包:http://www.nuget.org/packages/Microsoft.AspNet.WebApi.Cors/
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
ASP.NET Web API 跨域访问(CORS)要注意的地方相关推荐
- ASP.NET MVC和ASP.NET Web API跨域请求问题解决方案【最全】
无论是ASP.NET MVC和ASP.NET Web API跨域请求大致分成2种方式 第一种:web.config 配置 第二种:用HttpContext.Response.AppendHeader设 ...
- Web API 跨域访问
JS调用接口最需要注意的就是跨域问题 在.net平台下使js跨域变得非常简单 1.在nuget中引用 Microsoft ASP.NET Web API 2.2 Cross-Origin Suppor ...
- Web应用跨域访问解决方案
Web应用跨域访问解决方案 Web应用的跨域访问解决方案 Web跨域访问解决方案 做过跨越多个网站的Ajax开发的朋友都知道,如果在A网站中,我们希望使用Ajax来获得B网站中的特定内容,如果A网站与 ...
- Web应用跨域访问及单点登录解决方案汇总
做过跨越多个网站的Ajax开发的朋友都知道,如果在A网站中,我们希望使用Ajax来获得B网站中的特定内容,如果A网站与B网站不在同一个域中,那么就出现了跨域访问问题.Ajax的跨域访问问题是现有的Aj ...
- ABP框架Web API跨域问题的解决方案
ABP框架Web API跨域问题的解决方案 参考文章: (1)ABP框架Web API跨域问题的解决方案 (2)https://www.cnblogs.com/farb/p/ABPWebAPICros ...
- asp.net关于如何准许api跨域访问
首先需要在原api接口的程序中在web.config添加如下节点(在<system.webServer>节点下) <!--准许跨域请求--><httpProtocol&g ...
- 开启OpenStack Api跨域请求(CORS)功能
2019独角兽企业重金招聘Python工程师标准>>> 如果你打算在js中使用openstack接口(如jstack),就会碰到js的跨域请求问题,解决方法是要在openstack ...
- 【转】在ASP.NET Web API 2中使用Owin基于Token令牌的身份验证
基于令牌的身份验证 基于令牌的身份验证主要区别于以前常用的基于cookie的身份验证,基于cookie的身份验证在B/S架构中使用比较多,但是在Web Api中因其特殊性,基于cookie的身份验证已 ...
- ASP.NET Web API自身对CORS的支持:从实例开始
在<通过扩展让ASP.NET Web API支持W3C的CORS规范>中我们通过自定义的HttpMessageHandler为ASP.NET Web API赋予了跨域资源共享的能力,具体来 ...
最新文章
- 关于Activity onNewIntent方法的调用时机
- 将html转换为pptx,javascript – 将html表导出到客户端的ppt?
- android--调用系统浏览器,Android 调用系统浏览器
- My97DatePicker详细说明
- Spark 报错 : Error: bad symbolic reference. A signature in SparkContext.class refers to term conf
- linux-获取帮助-ls命令-date命令-man命令
- 14-Shiro-单点登录原理
- 数据清洗之微博内容清洗
- [JPA错误]javax.persistence.EntityNotFoundException: Unable to find xxx
- 别学英语了!微软给PPT和Skype新加的这个功能,让你和老外从此交流无障碍
- 【Shotcut】沧海桑田_转场效果
- Linux使用grep查找文件内容
- idea重启端口占用问题
- error: resource android:style/TextAppearance.Material.Widget.Button.Colored not found. 解决办法
- Android查询AirPods电量,安卓手机查看AirPods电量的方法
- 怎么在VM虚拟机上装显卡等驱动
- 单词翻译程序 go实现
- 《测绘管理与法律法规》——地图管理
- 免费分享一个粉丝做的毕业设计学生宿舍管理系统!
- 腾讯Angel Graph团队刷新GNN最强榜单OGB世界纪录!
热门文章
- Windows10安装Jmeter(图文教程)
- Android 模拟器连接异常:Unable to connect to ADB server
- ecshop php5.5分类文字不显示,在PHP5.5下ecshop修正文件报错归类
- 树链剖分(入门学习)
- 动态html树形菜单模板,JS+CSS简易树状菜单Tree
- MySQL删除重复数据实例
- 计算机应用基础课改期望,《计算机应用基础》课改总结.doc
- 五年级计算机下册教案人教版,新人教版五年级下册信息技术全册教案.pdf
- java播放mp3背景音乐_Java如何实现MP3播放!!
- ireport模块之间的动态传参及拼接SQL