2013-07-06 43 views
15

Tôi đã thử sau bài này, nhưng tôi vẫn không khá có:Bật CORS có yêu cầu WebAPI PUT/POST?

CORS support for PUT and DELETE with ASP.NET Web API

Trong web.config của tôi, tôi đã điều sau đây:

<system.webServer> 
    <validation validateIntegratedModeConfiguration="false" /> 
    <httpProtocol> 
     <customHeaders> 
     <!-- TODO: don't let anyone make requests - only approved clients --> 
     <add name="Access-Control-Allow-Origin" value="*" /> 
     <add name="Access-Control-Allow-Headers" value="Content-Type" /> 
     <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" /> 
     </customHeaders> 
    </httpProtocol> 
    <handlers> 
     <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" /> 
     <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" /> 
     <remove name="ExtensionlessUrlHandler-Integrated-4.0" /> 
     <remove name="WebDAV" /> 
     <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" /> 
     <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" /> 
     <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" /> 
    </handlers> 
    <modules runAllManagedModulesForAllRequests="true"> 
     <remove name="WebDAVModule"/> 
    </modules> 
    </system.webServer> 

Nhưng trong chrome khi tôi thực hiện một yêu cầu POST tôi nhận được lỗi không được phép:

enter image description here

yêu cầu của tôi vẻ như thế này:

var request = $.ajax({ 
      async: true, 
      url: apiEndpoint + 'api/login', 
      type: 'POST', 
      data: JSON.stringify(data), 
      contentType: "application/json; charset=utf-8", 
      dataType: 'json' 
     }) 

apiEndpoint là trên máy chủ cục bộ nhưng trên một cổng khác - khách hàng và dự án api có các giải pháp khác nhau.

Yêu cầu POST cuối cùng cũng đến được máy chủ, nhưng tôi luôn gặp lỗi liên quan đến OPTIONS và tôi không bao giờ nhận được cookie được lưu cho khách hàng vì nó.

Tôi đã dành vài tiếng đồng hồ cuối cùng cố gắng để có được CORS với WebAPI làm việc:

https://aspnetwebstack.codeplex.com/wikipage?title=CORS%20support%20for%20ASP.NET%20Web%20API

Nhưng một số vấn đề phiên bản lắp ráp dẫn đến tôi giật mọi thứ - hy vọng có một giải pháp đơn giản hơn.

Trả lời

23

BÀI ĐĂNG, PUT, DELETE, v.v. sử dụng CORS được bay trước. Trình duyệt gửi yêu cầu OPTIONS. Vì bạn không có một phương thức hành động xử lý OPTIONS, bạn đang nhận được 405. Ở dạng đơn giản nhất của nó, bạn phải thực hiện một phương thức hành động như thế này trong bộ điều khiển của bạn.

public HttpResponseMessage Options() 
{ 
    var response = new HttpResponseMessage(); 
    response.StatusCode = HttpStatusCode.OK; 
    return response; 
} 

Một điều cần lưu ý là các customHeaders bạn đã cấu hình trong web.config sẽ tự động được thêm cần thiết Access-Control-Allow-OriginAccess-Control-Allow-Methods tiêu đề. Vì vậy, các phương pháp hành động không làm như vậy.

Phương thức hành động triển khai trong trình điều khiển hoạt động nhưng có thể không phải là một lựa chọn tốt. Một tùy chọn tốt hơn sẽ là triển khai trình xử lý tin nhắn thực hiện điều này cho bạn. Một lựa chọn tốt hơn nhiều là sử dụng mô hình nhận dạng suy nghĩ để bật CORS. Web API 2 có hỗ trợ CORS tích hợp (lấy từ ttidm).

+1

Cảm ơn bạn Badri. Điều này đã đẩy tôi thêm một bước nữa! – SB2055

+1

Làm thế nào bạn sẽ thực hiện điều này trong bộ điều khiển? –

+0

Imo POST không tạo yêu cầu preflight –

Các vấn đề liên quan