2012-09-20 66 views
30

estoy trabajando con la versión final de la API Web ASP.NET para implementar un API de JavaScript de usar. Por varios tutoriales, he permitido CORS en mi web.config:CORS soporte para PUT y DELETE con 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> 

Con lo anterior, varios dominios GET y POST peticiones funcionan bien, pero PUT y DELETE solicitudes tanto fallar.

En Chrome:

PUT Método no permitido por Access-Control-Allow-Métodos.

El método DELETE no está permitido por Access-Control-Allow-Methods.

¿Se requiere algo más para obtener verbos PUT y DELETE que trabajen entre dominios?

+1

¿Cómo se permitió CORS en su webconfig? – Rushino

+0

¿También tiene un manejador de CORS global? ¿O arreglaste los CORS en el web.config solamente? –

+0

Implementé esto en el nivel web.config solamente. –

Respuesta

40

Parece que la adición de otro encabezado personalizado resolvieron todo:

<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

Esto no funciona para mí. Solo funciona para GET y POST. –

21

también, además de Nathan respuesta, asegúrese de discapacitados módulo de WebDAV de IIS y configurar runAllManagedModulesForAllRequests="true" entorno en el web.config:

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

Sin esto, preflight CORS requests (que se utilizan para PUT, ELIMINAR métodos y enviar solicitudes OPCIONES adicionales) no funcionará.

+0

¡Ah, gracias! Mi controlador CORS no funcionaba sin esas líneas de código en web.config. –

+3

¿Qué hace el controlador 'WebDAV', y por qué necesita ser eliminado? –

+0

¡Gracias a un millón! –

6

solución muy simple para superar CORS Edición en WEBAPI2.2.

Añadir lo siguiente en que WebAPI archivo de configuración.

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

Antes de agregar esto, asegúrese de quitar el encabezado personalizado en el archivo 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" /> 

Si tiene tanto CustomHeader así la CORS habilitar WebApiconfig, que se enfrentará el error coros.

Añadir los coros habilitados en config WebAPI va a resolver el problema.

+1

Esta es una buena solución actual y una buena explicación.Como mencionó, asegúrese de que ambas configuraciones no existan (WebApiConfig.cs _y_Web.config) o que la configuración de CORS tenga un conflicto y el resultado sea 'El encabezado 'Access-Control-Allow-Origin' contiene valores múltiples 'http: // localhost: 1234, * ', pero solo uno está permitido. error. – atconway

+2

Además, uno necesita el siguiente paquete NuGet para usar la clase 'EnableCorsAttribute': https://www.nuget.org/packages/Microsoft.AspNet.WebApi.Cors – atconway

0

Utilice esto en web.config, mientras que implementó su aplicación, no lo utilizo en web.config locales

<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> 
Cuestiones relacionadas