Saltar al contenido

“El recurso solicitado no admite el método http ‘OPTIONS'” cuando se usa EnableCors

Solución:

Para mí, agregué los siguientes encabezados a la solicitud agregando el siguiente código al Application_BeginRequest función de la Global.asax.cs expediente:

protected void Application_BeginRequest()
{
    if (Request.Headers.AllKeys.Contains("Origin", StringComparer.CurrentCultureIgnoreCase)
        && Request.HttpMethod == "OPTIONS")
    {
        Response.AddHeader("Access-Control-Allow-Headers", "content-type", "accept", "pragma", "cache-control", "authorization");
        Response.End();
    }
}

Tengo poca idea de por qué funciona esto. Por curiosidad, intenté agregar todos los encabezados usando un asterisco, pero luego la API web se quejó de que faltaba el encabezado de Autorización.

Probablemente te hayas perdido la llamada de nivel superior a HttpConfiguration.EnableCors, como se describe aquí: https://enable-cors.org/server_aspnet.html.

Agregue este código a su configuración:

public static void Register(HttpConfiguration config)
{
    // New code
    config.EnableCors();
}

Para asegurar el OPTIONS solicitud es manejada por el código de su aplicación y no por alguna otra parte del sistema antes de que llegue al código de su aplicación, puede intentar agregar lo siguiente a su web.config:

<system.webServer>
  <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>

Es posible que también deba incluir:

<add name="OPTIONSVerbHandler" path="*" verb="OPTIONS"
  modules="IsapiModule" requireAccess="None"
  scriptProcessor="C:WindowsSystem32inetsrvasp.dll"
  resourceType="Unspecified" />

Vea la respuesta en IIS secuestra la solicitud de OPCIONES de verificación previa de CORS.

O tal vez incluso solo esto:

 <add name="OPTIONSVerbHandler" path="*" verb="OPTIONS"
   modules="ProtocolSupportModule" requireAccess="None" />

Si nada de eso por sí solo funciona, entonces en su global.asax u otro código que pueda probar:

if (filterContext.HttpContext.Request.HttpMethod == "OPTIONS")
{
    filterContext.HttpContext.Response.Flush();
}

… o alguna otra variación de eso, por ejemplo:

if (Request.Headers.AllKeys.Contains("Origin", StringComparer.OridinalIgnoreCase)
    && Request.HttpMethod == "OPTIONS") {
    Response.Flush();
}

Independientemente del código específico que use para hacerlo, el punto es:

  • asegurarse OPTIONS las solicitudes en realidad son capturadas / manejadas por el código de su aplicación, no capturadas / manejadas por alguna otra parte del sistema antes de llegar al código de su aplicación
  • asegúrese de tener un manejo explícito para OPTIONS solicitudes en el código de su aplicación
  • hacer el OPTIONS manejo en el código de su aplicación simplemente haga Response.Flush()

U otro enfoque que no estoy seguro es relevante para su situación como codificado, pero mencionaré por si acaso:

public HttpResponseMessage Options()
{
    var response = new HttpResponseMessage
    {
        StatusCode = HttpStatusCode.OK
    };
    return response;
}
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *