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
代碼下載: