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

代碼下載:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM