permitir el intercambio de recursos entre orígenes en IIS7

Resuelto Andrew asked hace 12 años • 11 respuestas

Recientemente me encontré con la publicación de solicitudes de Javascript en otro dominio. De forma predeterminada, no se permite la publicación XHR en otros dominios.

Siguiendo las instrucciones de http://enable-cors.org/ , habilité esto en el otro dominio.

<?xml version="1.0" encoding="utf-8"?>
<configuration>
 <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>
</configuration>

ingrese la descripción de la imagen aquí

Todo funciona bien ahora, sin embargo, todavía devuelve una respuesta 405 antes de enviar la respuesta 200 funcional.

Request URL:http://testapi.nottherealsite.com/api/Reporting/RunReport
Request Method:OPTIONS
Status Code:405 Method Not Allowed
Request Headersview source
Accept:*/*
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-GB,en-US;q=0.8,en;q=0.6
Access-Control-Request-Headers:origin, content-type, accept
Access-Control-Request-Method:POST
Connection:keep-alive
Host:testapi.nottherealsite.com
Origin:http://test.nottherealsite.com
Referer:http://test.nottherealsite.com/Reporting
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1
Response Headersview source
Access-Control-Allow-Headers:Content-Type
Access-Control-Allow-Methods:GET,PUT,POST,DELETE,OPTIONS
Access-Control-Allow-Origin:*
Allow:POST
Cache-Control:private
Content-Length:1565
Content-Type:text/html; charset=utf-8
Date:Tue, 18 Sep 2012 14:26:06 GMT
Server:Microsoft-IIS/7.5
X-AspNet-Version:4.0.30319
X-Powered-By:ASP.NET

Actualización: 02/03/2014

Hay un artículo actualizado recientemente en la revista MSDN. Detallando el soporte de CORS en ASP.NET Web API 2.

http://msdn.microsoft.com/en-us/magazine/dn532203.aspx

Andrew avatar Sep 17 '12 18:09 Andrew
Aceptado

Es probable que IIS 7 "maneje" la respuesta de OPCIONES HTTP en lugar de que su aplicación la especifique. Para determinar esto, en IIS7,

  1. Vaya a las asignaciones de controladores de su sitio.

  2. Desplácese hacia abajo hasta 'OPTIONSVerbHandler'.

  3. Cambie el 'ProtocolSupportModule' a 'IsapiHandler'

  4. Configure el ejecutable: %windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll

Ahora, las entradas de configuración anteriores deberían activarse cuando se envía un verbo de OPCIONES HTTP.

Alternativamente, puede responder al verbo OPCIONES HTTP en su método BeginRequest.

    protected void Application_BeginRequest(object sender,EventArgs e)
    {
        HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*");

        if(HttpContext.Current.Request.HttpMethod == "OPTIONS")
        {
            //These headers are handling the "pre-flight" OPTIONS call sent by the browser
            HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");
            HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept");
            HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000" );
            HttpContext.Current.Response.End();
        }

    }
Mendhak avatar Jan 31 '2013 16:01 Mendhak

Encontré que la información que se encuentra en http://help.infragistics.com/Help/NetAdvantage/jQuery/2013.1/CLR4.0/html/igOlapXmlaDataSource_Configuring_IIS_for_Cross_Domain_OLAP_Data.html es muy útil para configurar OPCIONES HTTP para un servicio WCF en IIS 7.

Agregué lo siguiente a mi web.config y luego moví OPTIONSVerbHandler en la lista de 'asignaciones de manejadores' de IIS 7 a la parte superior de la lista. También le di acceso de lectura a OPTIONSVerbHander haciendo doble clic en el controlador en la sección de asignaciones del controlador, luego en 'Solicitar restricciones' y luego haciendo clic en la pestaña de acceso.

Desafortunadamente, descubrí rápidamente que IE no parece admitir la adición de encabezados a su objeto XDomainRequest (configurando el tipo de contenido en texto/xml y agregando un encabezado SOAPAction).

Solo quería compartir esto porque pasé la mayor parte del día buscando cómo manejarlo.

<system.webServer>
    <httpProtocol>
        <customHeaders>
            <add name="Access-Control-Allow-Origin" value="*" />
            <add name="Access-Control-Allow-Methods" value="GET,POST,OPTIONS" />
            <add name="Access-Control-Allow-Headers" value="Content-Type, soapaction" />
        </customHeaders>
    </httpProtocol>
</system.webServer>
DavidG avatar Apr 26 '2013 05:04 DavidG