一、客户端用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)要注意的地方相关推荐

  1. ASP.NET MVC和ASP.NET Web API跨域请求问题解决方案【最全】

    无论是ASP.NET MVC和ASP.NET Web API跨域请求大致分成2种方式 第一种:web.config 配置 第二种:用HttpContext.Response.AppendHeader设 ...

  2. Web API 跨域访问

    JS调用接口最需要注意的就是跨域问题 在.net平台下使js跨域变得非常简单 1.在nuget中引用 Microsoft ASP.NET Web API 2.2 Cross-Origin Suppor ...

  3. Web应用跨域访问解决方案

    Web应用跨域访问解决方案 Web应用的跨域访问解决方案 Web跨域访问解决方案 做过跨越多个网站的Ajax开发的朋友都知道,如果在A网站中,我们希望使用Ajax来获得B网站中的特定内容,如果A网站与 ...

  4. Web应用跨域访问及单点登录解决方案汇总

    做过跨越多个网站的Ajax开发的朋友都知道,如果在A网站中,我们希望使用Ajax来获得B网站中的特定内容,如果A网站与B网站不在同一个域中,那么就出现了跨域访问问题.Ajax的跨域访问问题是现有的Aj ...

  5. ABP框架Web API跨域问题的解决方案

    ABP框架Web API跨域问题的解决方案 参考文章: (1)ABP框架Web API跨域问题的解决方案 (2)https://www.cnblogs.com/farb/p/ABPWebAPICros ...

  6. asp.net关于如何准许api跨域访问

    首先需要在原api接口的程序中在web.config添加如下节点(在<system.webServer>节点下) <!--准许跨域请求--><httpProtocol&g ...

  7. 开启OpenStack Api跨域请求(CORS)功能

    2019独角兽企业重金招聘Python工程师标准>>> 如果你打算在js中使用openstack接口(如jstack),就会碰到js的跨域请求问题,解决方法是要在openstack ...

  8. 【转】在ASP.NET Web API 2中使用Owin基于Token令牌的身份验证

    基于令牌的身份验证 基于令牌的身份验证主要区别于以前常用的基于cookie的身份验证,基于cookie的身份验证在B/S架构中使用比较多,但是在Web Api中因其特殊性,基于cookie的身份验证已 ...

  9. ASP.NET Web API自身对CORS的支持:从实例开始

    在<通过扩展让ASP.NET Web API支持W3C的CORS规范>中我们通过自定义的HttpMessageHandler为ASP.NET Web API赋予了跨域资源共享的能力,具体来 ...

最新文章

  1. 关于Activity onNewIntent方法的调用时机
  2. 将html转换为pptx,javascript – 将html表导出到客户端的ppt?
  3. android--调用系统浏览器,Android 调用系统浏览器
  4. My97DatePicker详细说明
  5. Spark 报错 : Error: bad symbolic reference. A signature in SparkContext.class refers to term conf
  6. linux-获取帮助-ls命令-date命令-man命令
  7. 14-Shiro-单点登录原理
  8. 数据清洗之微博内容清洗
  9. [JPA错误]javax.persistence.EntityNotFoundException: Unable to find xxx
  10. 别学英语了!微软给PPT和Skype新加的这个功能,让你和老外从此交流无障碍
  11. 【Shotcut】沧海桑田_转场效果
  12. Linux使用grep查找文件内容
  13. idea重启端口占用问题
  14. error: resource android:style/TextAppearance.Material.Widget.Button.Colored not found. 解决办法
  15. Android查询AirPods电量,安卓手机查看AirPods电量的方法
  16. 怎么在VM虚拟机上装显卡等驱动
  17. 单词翻译程序 go实现
  18. 《测绘管理与法律法规》——地图管理
  19. 免费分享一个粉丝做的毕业设计学生宿舍管理系统!
  20. 腾讯Angel Graph团队刷新GNN最强榜单OGB世界纪录!

热门文章

  1. Windows10安装Jmeter(图文教程)
  2. Android 模拟器连接异常:Unable to connect to ADB server
  3. ecshop php5.5分类文字不显示,在PHP5.5下ecshop修正文件报错归类
  4. 树链剖分(入门学习)
  5. 动态html树形菜单模板,JS+CSS简易树状菜单Tree
  6. MySQL删除重复数据实例
  7. 计算机应用基础课改期望,《计算机应用基础》课改总结.doc
  8. 五年级计算机下册教案人教版,新人教版五年级下册信息技术全册教案.pdf
  9. java播放mp3背景音乐_Java如何实现MP3播放!!
  10. ireport模块之间的动态传参及拼接SQL