博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
asp.net web api 2 对跨域资源共享的支持
阅读量:4564 次
发布时间:2019-06-08

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

1. 同源策略:

同源策略是浏览器为保证安全最基本的功能, 只有同源的脚本才能够被执行,那么什么是同源呢?同源是指协议,域名以及端口号都相同,任何一个不同的都不为同源资源,即异源。
2. 跨域访问Api接口:
在面向服务架构的项目开发过程中,我们往往会面对对于跨域资源的访问,由于浏览器的同源策略,它会阻止我们去访问异源资源,那么在我们编写好我们的api接口之后, 我们需要如何在跨域的情况下访问我们的
api接口呢? 在asp.net web api 2.0中, 我们可以使用 CorsMessageHandler 类来处理 Cors (Cross-origin resource sharing)请求, 首先我们可以通过 工具-> Nuget程序包管理器 -> 程序包管理器控制台, 键入:
install-package Microsoft.AspNet.WebApi.Cors
来获取 Microsoft.AspNet.Cors.5.0.0 和 Microsoft.AspNet.WebApi.Cors.5.0.0 这两个包,我们的项目便会引入 System.Web.Cors.dll 和 System.Web.Http.Cors.dll 两个程序集, 下面, 我们
需要对程序进行配置以达到对 Cors的支持, 首先我们可以在 Global.asax 文件中的 Application_Start 方法中对 Cors 进行启用:
GlobalConfiguration.Configuration.EnableCors();
注意:这一句一定要放在
GlobalConfiguration.Configure(WebApiConfig.Register);
    1
这一句之前,博主之前由于讲这句代码放置在后者之后, 也就是当 GlobalConfiguration完成对 WebApiConfig配置之后再进行启用 Cors ,所以完全就没有起到丝毫作用, 血的教训, 至于我是怎么发现这个错误的,是因为可以启用 Cors 的位置还有一个, 那就是在 WebApiConfig.cs 文件中:
// Web API configuration and services
config.EnableCors();
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);
当我们这样设置完成之后, 我们的程序就可以启用 Cors 请求来对我们的 Api 资源进行访问, 下面一步需要我们对 Controller进一步控制, 我们可以将 EnableCorsAttribute 特效放置在Controller之上, 这样就起到了对整个 Controller 所有 Action 的 Cors 控制 :
[EnableCors(origins: "*", headers: "*", methods: "*")]
public class GoodController : ApiController
{
}
EnableCorsAttribute 的构造函数有两个, 签名分别为:
EnableCorsAttribute(string origin, string headers, string methods)
EnableCorsAttribute(string origin, string headers, string methods, string exposedHeaders)    
    origin : 允许被访问的资源列表,使用逗号分隔, * 表示全部支持
    headers : 资源所支持的标头列表,使用逗号分隔, * 表示全部支持, null表示都不支持
    methods : 资源所支持的方法列表,使用逗号分隔, * 表示全部支持, null表示都不支持
    exposedHeaders : 资源所支持且可公开的标头列表,使用逗号分隔, 默认都不公开
当然,EnableCorsAttribute 也可以附加在 Action 上, 这样就只会在附加了此特性的 Action 起到控制作用, 当然, 当我在 Controller 上附加了 EnableCorsAttribute 特性之后,又不想在此 Controller 的部分 Action 上启用 Cors 访问, 那么可以在这些 Action 上附加 DisableCorsAttribute 特性,这样就可以解决这个问题。
我在控制器上附加了
[EnableCors(origins: "*", headers: "*", methods: "*")]
    1
如果大家只想将 api 给自己某几个引用使用的话, 那么可以在 origins 中添加自己想要给予访问权限的应用地址, 如:
[EnableCors(origins: "http://www.exampleA.com, http://www.exampleB.com", headers: "*", methods: "*")]
    1
这样设置之后, 只有就只有 http://www.exampleA.com, http://www.exampleB.com 这两个站点的应用可以跨域来访问我们的api 资源。
下面,我们来对比一下未启用 Cors 和启用 Cors 的情景:
未启用 Cors, 我们会发现在浏览器的开发者工具的控制台中:
未启用 Cors
当我们试图去请求一个不支持跨域资源共享的api时, 浏览器会返回给我们一个 405 (Method Not Allowed) , 下面一样提示我们没有权限去访问此 api接口 。
启用 Cors :
启用 Cors 之后
3. 其他的几种跨域请求方式:
当然, 为了我们的应用可以访问跨域资源的方法有很多, 博主所介绍的只是其中的一种而已, 具有所知还有大概一下几种:
    使用 script 标签:
    <script type="text/javascript" src="http://localhost:5267/api/good?callback=jsonpCallback"></script>
    <script type="text/javascript">
        function jsonpCallback(data){
        }
    </script>
        1
        2
        3
        4
        5
        6
由于带有src属性的标签都是具有跨域资源请求能力的,所以我们可以借助这一点待完成跨域,但是注意, 使用着一种方式需要在你申明 api所返回的数据中做一些细微处理:
    request["callback"]+"("+返回的原始数据+")"
    1
例如你要返回的 json数据为
    {id:'s001', name: '...'}
    1
而你请求中的callback参数为 jsonpCallback,通过 request获取 callback 参数之后, 需要这样处理:
    jsonpCallback({id:'s001', name: '...'})
    1
    使用 $.ajax:
    $.ajax({
        type: 'get',
        url: '你的api地址',
        dataType: 'jsonp'
    }).done(
        function(data){
        }
    );
其实使用上面的这种方式,实际上产生的效果是与第一种是一样的,当我们发送请求之后, 我们观察请求类型, 实际上也是请求了一个 script。 注意一点,如果使用构造 script 的方式来请求跨域,
那么我们是无法使用除 get方式之外的请求方式的, 这个也是这种方式相当大的一个缺陷。
    使用 $.ajax 的 crossDomain :
具体 api 文档可以参考 http://api.jquery.com/jQuery.ajax/
这种方式是构建 XMLHttpRequest 请求, 具体可参考: http://www.html5rocks.com/en/tutorials/cors/#toc-types-of-cors-requests
后面我将案例完善之后, 我会将源码一并贴出来, 是一个基于 asp.net web api 2.0 + knockout.js 的案例。
---------------------
作者:Rajesh_James
来源:CSDN
原文:https://blog.csdn.net/zhanxueguang/article/details/46821511
版权声明:本文为博主原创文章,转载请附上博文链接!

转载于:https://www.cnblogs.com/rebelboy/p/9925808.html

你可能感兴趣的文章
软键盘覆盖EditText解决方法
查看>>
Daily Scrumming* 2015.11.1(Day 13)
查看>>
css不定高图文垂直居中的三种方法
查看>>
剑指offer--1.二维数组中的查找
查看>>
第3次作业:团队介绍
查看>>
[html][javascript]父子窗体传值
查看>>
收房细则
查看>>
读《Android深度探索(卷1)HAL与驱动开发》的一些思考10
查看>>
二十三、uevnet机制和U盘自动挂载
查看>>
Kettle 提取mongodb最大编号
查看>>
Vue2.0-token权限处理
查看>>
Caffeine缓存
查看>>
JavaScript 回车键转成Tab键
查看>>
CentOS7配置MySQL5.7主备
查看>>
合并区间(LintCode)
查看>>
mysql索引的创建
查看>>
《 BCG 原创 :系列 三》 添加菜单栏
查看>>
Java中关于CyclicBarrier的使用
查看>>
vsftpd配置教程
查看>>
first ios app
查看>>