asp.net-mvc - net - iis cors options
IIS secuestra solicitud CORS Preflight OPTIONS (8)
En nuestro caso, se solicitó el filtrado en IIS deshabilitando el verbo OPTIONS en el nivel de aplicación web raíz. Abra el Administrador de IIS, haga clic en la aplicación raíz, haga clic en Solicitar filtrado, si aparece OPCIONES en la lista, elimine o Permita verbo. Ojalá hubiera comprobado esto primero como un montón de tiempo perdido.
Estoy haciendo una solicitud CORS POST y estableciendo el encabezado Content-Type en json. Esto activa una solicitud de OPCIONES Preflight para disparar (esto es bueno y esperado)
Esta solicitud de OPCIONES es respondida con un 200 OK, pero esto no viene de mi aplicación WebAPI.
Tengo un Manejador de mensajes personalizado en su lugar y nunca se golpea, por lo que IIS responde a la solicitud antes de que aparezca ASP.NET.
He encontrado varias publicaciones sobre el tema y dicen lo siguiente
Asegúrese de que WebDav esté desinstalado / eliminado / deshabilitado - HECHO
Asegúrese de que OPTIONSVerbHandler se elimine / cambie para usar aspnet_isapi.dll - TRIED AMBOS
Asegúrese de que el comando extensionlessURLHandler incluya el verbo OPTIONS - HECHO
Sin embargo, mi solicitud de opciones sigue siendo secuestrada. Con esto quiero decir, IIS responde con 200 OK pero no incluye un encabezado Access-Control-Allow-Origin en la respuesta. No incluye este encabezado porque nunca llega a mi código CORS de WebAPI que establecería este encabezado.
Los dos mejores mensajes que pude encontrar que suenan como mi problema son
aquí: JQuery se quedó atrapado en la comprobación preliminar de CORS y la respuesta fantasma de IIS
y aquí: http://brockallen.com/2012/10/18/cors-iis-and-webdav/
Intenté activar el seguimiento de solicitud fallida (FERB) en IIS y configurarlo para rastrear los 200 códigos de estado. No veo nunca que se haya registrado la solicitud de opciones ... No estoy seguro si esto significa que FERB no rastrea las solicitudes de OPCIONES o si necesito cambiar algo en la configuración de FERB para hacer un seguimiento de las solicitudes de OPCIONES, o si esto es una pista ¿a cuál es mi problema?
Esto es ASP.NET WebAPI 2.0 que se ejecuta en IIS 7.5 (también probado en IIS 8 e IISExpress con los mismos resultados) No importa qué navegador (Chrome, FF e IE fallan todos de la misma manera)
He intentado todo lo que puedo encontrar sobre el tema y todavía no puedo solucionar mi problema.
Ayúdame StackOverflow, eres mi única esperanza.
He instalado Microsoft.AspNet.WebApi.Cors
y Microsoft.Owin.Cors
para mi WebAPI basada en oWin y app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
agregado la app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
en la configuración como a continuación:
public class Startup : IStartup, IAppStartup
{
public void Configuration(IAppBuilder app)
{
var config = this.GetInjectionConfiguration();
BootstrapperWebApi bootstrapperWebApi = (BootstrapperWebApi)this.GetBootstrapperWebApi(config);
bootstrapperWebApi.Initialize(true)
.EnableLogging()
.DisableWebApiDefaultExceptionHandler();
WebApiConfig.Register(config);
app.UseOwinExceptionHandler();
app.Use<LoggerMiddleware>();
app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
//others stuff
}
Intenté todas las publicaciones mencionadas pero nada funcionó para mí, luego cambié mi servicio ASP.Net Web API 2 a Windows Server 2012 (IIS 8.5) y el mismo servicio funcionó sin cambios. Así que el problema era específico de IIS 7.5 en la máquina de Windows 7.
Probé todas las sugerencias anteriores, así como otras que encontré en SO, y lo que importaba en mi situación era que tuviéramos Filtrado de solicitudes habilitado en IIS y el OPTIONS HTTP Verb no estaba en la lista de verbos permitidos. Una vez que lo agregué, pude ordenar el resto.
Sé que esta es una publicación anterior, pero acabo de pasar por el mismo problema.
En mi situación, tengo CORS instalado tanto para OWIN como para WebAPI. El middleware OWIN CORS estaba interceptando la llamada OPTIONS mucho antes de que llegara a las cosas de WebAPI. Quizás esto ayude a alguien más en el futuro.
Tuve el mismo problema y la siguiente configuración de web.config lo solucionó.
<modules runAllManagedModulesForAllRequests="false">
<remove name="FormsAuthenticationModule" />
</modules>
<handlers>
<remove name="OPTIONSVerbHandler" />
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
Pude manejar solicitudes CORS OPTIONS manualmente en Application_BeginRequest.
Originalmente estaba usando la biblioteca detallada en esta publicación de blog para manejar solicitudes CORS. El producto en el que estoy trabajando requiere que runAllManagedModulesForAllRequests se establezca en falso, sin embargo. Es por eso que tuve que configurar una implementación personalizada, pero si no tienes ese requisito, debes probar esa biblioteca. Funcionó muy bien cuando pude haber runAllManagedModulesForAllRequests establecido en verdadero.
eso es lo que funcionó para mí después de 4 horas de búsqueda / experimentación:
<handlers>
<remove name="OPTIONSVerbHandler" />
<add name="OPTIONSVerbHandler" path="*" verb="OPTIONS" modules="IsapiModule" scriptProcessor="C:/Windows/System32/inetsrv/asp.dll" resourceType="Unspecified" requireAccess="None" />
</handlers>
Un par de cosas que puede probar aquí, todas relacionadas con web.config, primero modifique su elemento de módulos para incluir el atributo runAllManagedModulesForAllRequests="true"
, como se muestra a continuación:
<modules runAllManagedModulesForAllRequests="true">
<remove name="WebDavModule" />
</modules>
A continuación, configure sus controladores a continuación:
<handlers>
<remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
<remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<remove name="WebDav" />
<remove name="OPTIONSVerbHandler" />
<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>
Esto debería ser el truco, pero si no lo hace, como último recurso, puede forzar a IIS a que emita los encabezados correctos con lo siguiente:
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Methods" value="GET,PUT,POST,DELETE,OPTIONS" />
<add name="Access-Control-Allow-Headers" value="Content-Type" />
</customHeaders>
</httpProtocol>
</system.webServer>
Tenga cuidado con el valor comodín, realmente debe configurar esto para el nombre de dominio que se alojará en su sitio.