2012-09-20 15 views
30

Tôi đang làm việc với phiên bản cuối cùng của ASP.NET Web API để triển khai API thân thiện với JavaScript. Theo các hướng dẫn khác nhau, tôi đã bật CORS trong web.config của tôi:Hỗ trợ CORS cho PUT và DELETE bằng ASP.NET Web API

<system.webServer> 
<httpProtocol> 
    <customHeaders> 
    <add name="Access-Control-Allow-Origin" value="*" /> 
    <add name="Access-Control-Allow-Headers" value="Content-Type" /> 
    </customHeaders> 
</httpProtocol> 
</system.webServer> 

Với yêu cầu GET và POST ở trên làm việc tốt, nhưng yêu cầu PUT và DELETE đều thất bại.

Trong Chrome:

Phương pháp PUT không được phép bởi Access-Control-Allow-Phương.

Phương thức DELETE không được cho phép bởi Access-Control-Allow-Methods.

Có điều gì khác cần thiết để nhận các động từ PUT và DELETE làm việc giữa nhiều miền không?

+1

Làm thế nào bạn kích hoạt CORS trong webconfig của bạn? – Rushino

+0

Bạn có trình xử lý CORS toàn cầu không? Hoặc bạn đã sửa CORS chỉ trong web.config? –

+0

Tôi đã thực hiện điều này ở cấp độ web.config chỉ. –

Trả lời

40

Dường như thêm một tiêu đề tùy chỉnh sắp xếp nó ra:

<system.webServer> 
<httpProtocol> 
    <customHeaders> 
    <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> 
</system.webServer> 
+1

Điều này không hiệu quả đối với tôi. Chỉ hoạt động cho GET và POST. –

21

Ngoài ra, bên cạnh Nathan câu trả lời, hãy chắc chắn bạn vô hiệu hóa mô-đun WebDAV IIS và thiết runAllManagedModulesForAllRequests="true" thiết lập trong web.config:

<system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"> 
    <remove name="WebDAVModule"/> 
    </modules> 
    <handlers> 
    <remove name="WebDAV" /> 
    </handlers> 
</system.webServer> 

Nếu không có điều này, preflight CORS requests (được sử dụng cho các phương pháp PUT, DELETE và gửi yêu cầu OPTIONS bổ sung) sẽ không hoạt động.

+0

Ah cảm ơn! Trình xử lý CORS của tôi không hoạt động nếu không có các dòng mã trong web.config. –

+3

Trình xử lý 'WebDAV' là gì và tại sao nó cần phải được loại bỏ? –

+0

Cảm ơn một triệu! –

6

Giải pháp rất đơn giản để khắc phục sự cố CORS trong WEBAPI2.2.

Thêm thông tin sau vào tệp WebApi Config File.

var cors = new EnableCorsAttribute("*", "*", "*"); 
Config.EnableCors(cors); 

Trước khi thêm điều này, hãy đảm bảo bạn xóa tiêu đề tùy chỉnh trong tệp Web.config.

<add name="Access-Control-Allow-Origin" value="*" /> 
    <add name="Access-Control-Allow-Credentials" value="true" /> 
    <add name="Access-Control-Allow-Headers" value="Origin, X-Requested-With, Content-Type, Accept, X-Token" /> 
    <add name="Access-Control-Allow-Methods" value="GET,PUT,POST,DELETE,OPTIONS" /> 

Nếu bạn có cả hai tiêu đề tùy chỉnh cũng như CORS được bật trong WebApiconfig, bạn sẽ gặp lỗi cors.

Thêm cors được bật trong cấu hình WebApi sẽ giải quyết được sự cố.

+1

Đây là giải pháp tốt và giải thích tốt.Như bạn đã đề cập, hãy đảm bảo cả hai cấu hình không tồn tại (WebApiConfig.cs _and_ Web.config) hoặc cấu hình CORS sẽ có xung đột và dẫn đến tiêu đề 'Access 'Control-Allow-Origin' chứa nhiều giá trị 'http: // localhost: 1234, * ', nhưng chỉ một lỗi được phép.'. – atconway

+2

Ngoài ra, cần có gói NuGet sau để sử dụng lớp 'EnableCorsAttribute': https://www.nuget.org/packages/Microsoft.AspNet.WebApi.Cors – atconway

0

Vui lòng sử dụng này trong web.config trong khi bạn triển khai ứng dụng của bạn, không sử dụng trong web.config địa phương

<system.webServer> 
    <httpProtocol> 
     <customHeaders> 
     <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> 
<ModSecurity enabled="false" configFile="C:\inetpub\wwwroot\owasp_crs\modsecurity.conf" /> 
    <validation validateIntegratedModeConfiguration="false" /> 
    <handlers> 
     <remove name="ExtensionlessUrlHandler-Integrated-4.0" /> 
     <remove name="OPTIONSVerbHandler" /> 
     <remove name="TRACEVerbHandler" /> 
     <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" /> 
    </handlers> 

    </system.webServer>