ASP.NET Web API 支持 CORS

Cross-Origin Resource Sharing (CORS) 是W3C草案拟定的浏览器与服务端如何进行跨域请求的方式,其原理是用自定义HTTP头来让浏览器和SERVER决定request、response的成功或失败。目前几乎所有浏览器都已经支持了(Internet Explorer 8+, Firefox 3.5+, Safari 4+, and Chrome)。

使用一个GET或POST发送一个未自定义头的请求时,会额外添加一个叫做Origin的头,其包含了请求页面的协议、域名和端口,后台可以根据这些信息很轻松的判断出是否要给出正确的response,就像下面这样

Origin: http://www.cnblogs.com

如果server允许这个请求,则会得到一个HEADER包含Access-Control-Allow-Origin的响应,而Access-Control-Allow-Origin的值则为刚刚Origin的值或*(公开资源),比如:

Access-Control-Allow-Origin: http://www.cnblogs.com

如果没有这个HEADER或者HEADER不匹配,浏览器则会拒绝这个请求,匹配上了就会成功,但不管是否成功,这个请求都不会带有任何cookie信息。

之前提到的所有浏览器都支持这种简单的请求方式。Firefox 3.5+, Safari 4+和 Chrome使用XMLHttpRequest对象来实现,这跟普通的请求是一样的,但当浏览器发现请求的是跨域的资源时,CORS模式会自动被触发,而不需要额外的代码来处理.

ASP.NET Web API 支持 CORS 支持的代码参见 http://code.msdn.microsoft.com/Implementing-CORS-support-418970ee,也可以通过Nuget 获取WebAPIContrib

PM> Install-Package WebAPIContrib

然后给你的Web API的Action 打上标签[EnableCors],例如下面的代码

// NOTE: Maybe it is not a good idea to expose the 'model' in the service/API. 
// Consider using use-case-based DTOs (http://davybrion.com/blog/2012/02/dtos-should-transfer-data-not-entities). 
public class ContactsController : ApiController 
{        
     private readonly IContactRepository repository;
     public ContactsController(IContactRepository repository) 
     {            
         this.repository = repository; 
     }
     [EnableCors] 
     public IQueryable<Contact> Get() 
     { 
         return repository.GetAll().AsQueryable(); 
     }
     [EnableCors] 
     public HttpResponseMessage Get(int id, HttpRequestMessage request) 
     { 
         var contact = repository.Get(id);
         if (contact == null) 
         { 
             var response = new HttpResponseMessage(HttpStatusCode.NotFound) 
             { 
                 Content = new StringContent("Contact not found.") 
             };
             throw new HttpResponseException(response); 
         }
         var contactResponse = request.CreateResponse(HttpStatusCode.OK, contact);
         contactResponse.Content.Headers.Expires = new DateTimeOffset(DateTime.Now.AddSeconds(300));
         return contactResponse; 
     }

参考:

http://www.nczonline.net/blog/2010/05/25/cross-domain-ajax-with-cross-origin-resource-sharing/

Using CORS to access ASP.NET services across domains

Cross-Origin Resource Sharing (CORS) and WCF

在asp.net web api中动态修改action的名字

ASP.NET Web API: CORS支持和基于属性的路由改进

Using Cross Origin Resource Sharing (CORS) in ASP.NET Web API

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏包子铺里聊IT

刷题外传之如何优雅的杀掉进程

进程(Process)是 Unix/Linux 系统下编程的核心知识。无论是小 Script 还是大 Daemon,启动后都是以进程的形势在 OS 中存在和执行...

3896
来自专栏Netkiller

PHP高级编程之守护进程

PHP高级编程之守护进程 摘要 2014-09-01 发表 2015-08-31 更新 2015-10-20 更新,增加优雅重启 ---- 目录 1. 什么是守...

3444
来自专栏哈雷彗星撞地球

Xcode 创建.a和framework静态库

最近因为项目中的聊天SDK,需要封装成静态库,所以实践了一下创建静态库的步骤,做下记录。

2052
来自专栏Aloys的开发之路

VirtualBox相关问题总结

VirtualBox Images: http://www.osboxes.org/virtualbox-images VirtualBoxes – Free ...

2638
来自专栏進无尽的文章

扒虫篇-Bug日志 Ⅲ

解决方法:可能是由于粘贴网页上的代码的时候两行之间的回车引起的,有未识别的回车或者换行,找到,删除掉就 OK了。

1462
来自专栏菩提树下的杨过

Drools(BRMS) 速成教程(上)

大家在日常开发中,肯定遇到过一些业务规则变来变去的需求,比如:会员积分系统(今天要新注册会员送10积分,明天要改成注册送优惠券,后天搞活动要改成注册自动变成高级...

1512
来自专栏恰童鞋骚年

.NET Core微服务之基于Consul实现服务治理(续)

上一篇发布之后,很多人点赞和评论,不胜惶恐,这一篇把上一篇没有弄到的东西补一下,也算是给各位前来询问的朋友的一些回复吧。

1655
来自专栏zhangdd.com

windows系统Tomcat启动过程中找不到JAVA_HOME解决方法

在winserver上明明已经安装了JDK1.6并设置好了JAVA_HOME,可偏偏Tomcat在启动过程中找不到。

861
来自专栏大内老A

深入剖析ASP.NET的编译原理之二:预编译(Precompilation)

在本篇文章的第一部分:深入剖析ASP.NET的编译原理之一:动态编译(Dynamical Compilation),详细讨论了ASP.NET如何进行动态编译的,...

1997
来自专栏大魏分享(微信公众号:david-share)

Oracle11g RAC双NFS仲裁容错方案

说明: 整理文档时发现自己在2010年写的一个RAC容灾方案,觉得有一些用,分享出来。当时为了验证此方案,做了很多PoC。方案相对比较复杂,但是也提供了一种思路...

5489

扫码关注云+社区

领取腾讯云代金券