2012-09-17 9 views
76

Recentemente mi sono imbattuto in richieste di Javascript in un altro dominio. Per impostazione predefinita, la pubblicazione XHR su altri domini non è consentita.abilitazione della condivisione di risorse tra origini su IIS7

Seguendo le istruzioni da http://enable-cors.org/, l'ho abilitato nell'altro 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> 

enter image description here

Tutto funziona bene ora, tuttavia è ancora restituisce una risposta 405 prima della restituzione del 200 risposta lavorare.

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 

Aggiornamento: 3/02/2014

C'è un articolo recentemente aggiornato nella rivista MSDN. CORS Detailing assistenza in ASP.NET Web API 2.

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

+0

è risolto il mio problema di ottenere falsi ordina icone dei plugin jQuery bootgrid desidera caricare glyphicons-halfling-regular.woff dai caratteri Bootstrap cartella –

risposta

65

E 'probabile un caso di IIS 7 'manipolazione' la risposta OPZIONI HTTP invece che l'applicazione specifica di esso. Per determinarlo, in IIS7,

  1. Vai ai mapping del gestore del sito.

  2. Scorrere fino a "OPTIONSVerbHandler".

  3. Cambiare il 'ProtocolSupportModule' a 'IsapiHandler'

  4. Impostare l'eseguibile: % windir% \ Microsoft.NET \ Framework \ v4.0.30319 \ aspnet_isapi.dll

Ora, le voci di configurazione sopra riportate dovrebbero entrare quando viene inviato un verbo OPZIONI HTTP.

In alternativa è possibile rispondere al verbo OPZIONI HTTP nel metodo 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(); 
     } 

    } 
+4

Ho provato entrambi metodo, ma solo il metodo BeginRequest funziona per me. Grazie @Shah –

+0

Per me, aggiungerlo a web.config nello stesso modo in cui OP era l'unico modo. Global.asax/BeginRequest non ha funzionato. – twDuke

+4

Dopo 2 giorni di ricerca, l'utilizzo della soluzione alternativa basata su 'Application_BeginRequest' era l'unico modo per risolvere il problema. Ho provato altri metodi usando 'customHeaders' (http://stackoverflow.com/a/19091291/827168), rimuovendo il gestore di' OPTIONSVerbHandler', rimuovendo il modulo 'WebDAV' e il gestore (http://stackoverflow.com/a/20705500/ 827168) ma nessuno ha funzionato per me. Spero che questo aiuti gli altri. E grazie a @Mendhak per la tua risposta! – pomeh

9

La risposta 405 è una risposta "Metodo non consentito". Sembra che il tuo server non sia configurato correttamente per gestire le richieste di verifica preliminare di CORS. Devi fare due cose:

1) Abilitare IIS7 per rispondere alle richieste OPZIONI HTTP. Stai ottenendo il 405 perché IIS7 sta rifiutando la richiesta OPTIONS. Non so come farlo perché non ho familiarità con IIS7, ma probabilmente ci sono altri su Stack Overflow che lo fanno.

2) Configurare l'applicazione per rispondere alle richieste di verifica preliminare CORS. È possibile farlo aggiungendo le seguenti due righe sotto la linea Access-Control-Allow-Origin nella sezione <customHeaders>:

<add name="Access-Control-Allow-Methods" value="GET,PUT,POST,DELETE" /> 
<add name="Access-Control-Allow-Headers" value="Content-Type" /> 

potrebbe essere necessario aggiungere altri valori alla sezione Access-Control-Allow-Headers sulla base di ciò intestazioni vostra richiesta sta chiedendo. Hai il codice di esempio per fare una richiesta?

Si può imparare di più su CORS e CORS preflight qui: http://www.html5rocks.com/en/tutorials/cors/

15

ho trovato le informazioni disponibili all'indirizzo http://help.infragistics.com/Help/NetAdvantage/jQuery/2013.1/CLR4.0/html/igOlapXmlaDataSource_Configuring_IIS_for_Cross_Domain_OLAP_Data.html per essere molto utile nella creazione di OPZIONI HTTP per un servizio WCF in IIS 7.

ho aggiunto il seguente al mio web.config e poi spostato l'OPTIONSVerbHandler in l'elenco IIS 7 'hander mapping' in cima all'elenco. Ho anche dato l'accesso in lettura a OPTIONSVerbHander facendo doppio clic su hander nella sezione dei mapping del gestore, quindi su "Restrizioni richieste" e quindi facendo clic sulla scheda di accesso.

Purtroppo ho trovato rapidamente che IE non sembra supportare l'aggiunta di intestazioni al loro oggetto XDomainRequest (impostando Content-Type su text/xml e aggiungendo un'intestazione SOAPAction).

Volevo solo condividere questo come ho trascorso la parte migliore di una giornata alla ricerca di come gestirlo.

+0

La configurazione isapiHandler di IIS di Shah non ha funzionato, tuttavia non ho provato il modo di programmazione. Tuttavia ho anche trovato la configurazione WCF di cui sopra in web.config ha fatto il trucco. Chrome invia ancora OPTIONS e ottiene 405 la prima volta, ma poi POST un'altra richiesta, che quindi è corretta. – Marshal

+0

Sembra che la versione corrente di Chrome non tenga in considerazione le intestazioni dei bus ricevute su una risposta con stato http di errore. Quindi non accadrà più in questo caso ed eseguirà la richiesta interdominio. Questo è un comportamento migliore imho. –

+0

Grazie per questa risposta.Se hai scremato la risposta sopra, non dimenticare di dare l'accesso in lettura OPTIONSVerbHander come descritto sopra. –

21

Non riesco a postare commenti, quindi devo metterlo in una risposta separata, ma è correlato alla risposta accettata da Shah.

Inizialmente ho seguito la risposta di Shahs (grazie!) Riconfigurando OPTIONSVerbHandler in IIS, ma le mie impostazioni sono state ripristinate quando ho ridistribuito la mia applicazione.

Ho finito per rimuovere OPTIONSVerbHandler nel mio Web.config.

<handlers> 
    <remove name="OPTIONSVerbHandler"/> 
</handlers> 
+12

Per coloro che non fanno settimana con web.config questo succede all'interno "" – SemanticZen

6

Elaborando da DavidG answer che è davvero vicino di ciò che è necessario per una soluzione di base:

  • In primo luogo, configurare l'OPTIONSVerbHandler da eseguire prima di gestori di .Net.

    1. Nella console IIS, selezionare "Mapping gestori" (sia a livello di server o di livello di sito; attenzione che sul livello di sito sarà ridefinire tutti i gestori per il tuo sito e ignorare ogni cambiamento fatto sul livello di server, dopo che, e ovviamente a livello di server, questo potrebbe interrompere altri siti se hanno bisogno della loro gestione delle opzioni verb).
    2. Nel riquadro Azione, selezionare "Visualizza elenco ordinato ..." Cercare OPTIONSVerbHandler e spostarlo (molti clic ...).

    Si può anche fare questo in web.config ridefinendo tutti i gestori di sotto <system.webServer><handlers> (<clear> poi <add ...> di nuovo, questo è ciò che fa la console di IIS per voi) (A proposito, non c'è bisogno di chiedere "leggere" l'autorizzazione per questo gestore)

  • in secondo luogo, configurare le intestazioni HTTP personalizzate per le vostre esigenze CORS, come ad esempio:.

    <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="POST,GET,OPTIONS"/> 
        </customHeaders> 
        </httpProtocol> 
    </system.webServer> 
    

    si può anche fare questo in console IIS.

Questa è una soluzione di base in quanto invierà intestazioni cors, anche su richiesta che non lo richiede. Ma con WCF sembra essere il più semplice.

Con MVC o webapi, potremmo invece gestire le intestazioni verb e cors OPTION con codice ("manualmente" o con supporto integrato disponibile nell'ultima versione di webapi).

+0

Questo ha funzionato per me. Non mi piace che ogni gestore venga ridefinito in Web.config ma purtroppo sembra essere quello che devo fare per rendere i nostri servizi WCF CORS abilitati. +1 – Manny

2

Con l'API Web ASP.net 2 installare il supporto incrociato Microsoft ASP.NET tramite nuget.

http://enable-cors.org/server_aspnet.html

public static void Register(HttpConfiguration config) 
{ 
var enableCorsAttribute = new EnableCorsAttribute("http://mydomain.com", 
                "Origin, Content-Type, Accept", 
                "GET, PUT, POST, DELETE, OPTIONS"); 
     config.EnableCors(enableCorsAttribute); 
} 
+0

Sai se è comunque necessario impostare "programmaticamente" il primo parametro "ORIGIN" di "EnableCorsAttribute"? Diciamo non qui nel registro, ma per ogni singola richiesta HTTP che arriva. Rileva l'origine da cui proviene, assicurati che sia OK (controlla contro un elenco di quelli approvati) quindi restituisci una risposta con 'Access-Allow-Control -Origin = "thatdomain.com" '? @Andrea –

1

Alsalaam aleykum.

Il primo modo è quello di seguire le istruzioni contenute in questo link:

http://help.infragistics.com/Help/NetAdvantage/jQuery/2013.1/CLR4.0/html/igOlapXmlaDataSource_Configuring_IIS_for_Cross_Domain_OLAP_Data.html

che corrisponde a queste configurazione:

<handlers> 
 
    <clear /> 
 
    <add name="OPTIONSVerbHandler" path="*" verb="OPTIONS" type="" modules="ProtocolSupportModule" scriptProcessor="" resourceType="Unspecified" requireAccess="Read" allowPathInfo="false" preCondition="" responseBufferLimit="4194304" /> 
 
    <add name="xamlx-ISAPI-4.0_64bit" path="*.xamlx" verb="GET,HEAD,POST,DEBUG" type="" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false" 
 
    preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="4194304" /> 
 
    <add name="xamlx-ISAPI-4.0_32bit" path="*.xamlx" verb="GET,HEAD,POST,DEBUG" type="" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false" 
 
    preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="4194304" /> 
 
    <add name="xamlx-Integrated-4.0" path="*.xamlx" verb="GET,HEAD,POST,DEBUG" type="System.Xaml.Hosting.XamlHttpHandlerFactory, System.Xaml.Hosting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" modules="ManagedPipelineHandler" scriptProcessor="" 
 
    resourceType="Unspecified" requireAccess="Script" allowPathInfo="false" preCondition="integratedMode,runtimeVersionv4.0" responseBufferLimit="4194304" /> 
 
    <add name="rules-ISAPI-4.0_64bit" path="*.rules" verb="*" type="" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false" preCondition="classicMode,runtimeVersionv4.0,bitness64" 
 
    responseBufferLimit="4194304" /> 
 
    <add name="rules-ISAPI-4.0_32bit" path="*.rules" verb="*" type="" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false" preCondition="classicMode,runtimeVersionv4.0,bitness32" 
 
    responseBufferLimit="4194304" /> 
 
    <add name="rules-Integrated-4.0" path="*.rules" verb="*" type="System.ServiceModel.Activation.ServiceHttpHandlerFactory, System.ServiceModel.Activation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" modules="ManagedPipelineHandler" 
 
    scriptProcessor="" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false" preCondition="integratedMode,runtimeVersionv4.0" responseBufferLimit="4194304" /> 
 
    <add name="xoml-ISAPI-4.0_64bit" path="*.xoml" verb="*" type="" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false" preCondition="classicMode,runtimeVersionv4.0,bitness64" 
 
    responseBufferLimit="4194304" /> 
 
    <add name="xoml-ISAPI-4.0_32bit" path="*.xoml" verb="*" type="" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false" preCondition="classicMode,runtimeVersionv4.0,bitness32" 
 
    responseBufferLimit="4194304" /> 
 
    <add name="xoml-Integrated-4.0" path="*.xoml" verb="*" type="System.ServiceModel.Activation.ServiceHttpHandlerFactory, System.ServiceModel.Activation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" modules="ManagedPipelineHandler" 
 
    scriptProcessor="" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false" preCondition="integratedMode,runtimeVersionv4.0" responseBufferLimit="4194304" /> 
 
    <add name="svc-ISAPI-4.0_64bit" path="*.svc" verb="*" type="" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false" preCondition="classicMode,runtimeVersionv4.0,bitness64" 
 
    responseBufferLimit="4194304" /> 
 
    <add name="svc-ISAPI-4.0_32bit" path="*.svc" verb="*" type="" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false" preCondition="classicMode,runtimeVersionv4.0,bitness32" 
 
    responseBufferLimit="4194304" /> 
 
    <add name="svc-Integrated-4.0" path="*.svc" verb="*" type="System.ServiceModel.Activation.ServiceHttpHandlerFactory, System.ServiceModel.Activation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" modules="ManagedPipelineHandler" scriptProcessor="" 
 
    resourceType="Unspecified" requireAccess="Script" allowPathInfo="false" preCondition="integratedMode,runtimeVersionv4.0" responseBufferLimit="4194304" /> 
 
    <add name="ISAPI-dll" path="*.dll" verb="*" type="" modules="IsapiModule" scriptProcessor="" resourceType="File" requireAccess="Execute" allowPathInfo="true" preCondition="" responseBufferLimit="4194304" /> 
 
    <add name="AXD-ISAPI-4.0_64bit" path="*.axd" verb="GET,HEAD,POST,DEBUG" type="" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false" 
 
    preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" /> 
 
    <add name="PageHandlerFactory-ISAPI-4.0_64bit" path="*.aspx" verb="GET,HEAD,POST,DEBUG" type="" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false" 
 
    preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" /> 
 
    <add name="SimpleHandlerFactory-ISAPI-4.0_64bit" path="*.ashx" verb="GET,HEAD,POST,DEBUG" type="" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" 
 
    allowPathInfo="false" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" /> 
 
    <add name="WebServiceHandlerFactory-ISAPI-4.0_64bit" path="*.asmx" verb="GET,HEAD,POST,DEBUG" type="" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" 
 
    allowPathInfo="false" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" /> 
 
    <add name="HttpRemotingHandlerFactory-rem-ISAPI-4.0_64bit" path="*.rem" verb="GET,HEAD,POST,DEBUG" type="" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" 
 
    allowPathInfo="false" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" /> 
 
    <add name="HttpRemotingHandlerFactory-soap-ISAPI-4.0_64bit" path="*.soap" verb="GET,HEAD,POST,DEBUG" type="" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" 
 
    allowPathInfo="false" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" /> 
 
    <add name="aspq-ISAPI-4.0_64bit" path="*.aspq" verb="*" type="" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false" preCondition="classicMode,runtimeVersionv4.0,bitness64" 
 
    responseBufferLimit="0" /> 
 
    <add name="cshtm-ISAPI-4.0_64bit" path="*.cshtm" verb="GET,HEAD,POST,DEBUG" type="" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false" 
 
    preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" /> 
 
    <add name="cshtml-ISAPI-4.0_64bit" path="*.cshtml" verb="GET,HEAD,POST,DEBUG" type="" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false" 
 
    preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" /> 
 
    <add name="vbhtm-ISAPI-4.0_64bit" path="*.vbhtm" verb="GET,HEAD,POST,DEBUG" type="" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false" 
 
    preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" /> 
 
    <add name="vbhtml-ISAPI-4.0_64bit" path="*.vbhtml" verb="GET,HEAD,POST,DEBUG" type="" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false" 
 
    preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" /> 
 
    <add name="TraceHandler-Integrated-4.0" path="trace.axd" verb="GET,HEAD,POST,DEBUG" type="System.Web.Handlers.TraceHandler" modules="ManagedPipelineHandler" scriptProcessor="" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false" preCondition="integratedMode,runtimeVersionv4.0" 
 
    responseBufferLimit="4194304" /> 
 
    <add name="WebAdminHandler-Integrated-4.0" path="WebAdmin.axd" verb="GET,DEBUG" type="System.Web.Handlers.WebAdminHandler" modules="ManagedPipelineHandler" scriptProcessor="" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false" preCondition="integratedMode,runtimeVersionv4.0" 
 
    responseBufferLimit="4194304" /> 
 
    <add name="AssemblyResourceLoader-Integrated-4.0" path="WebResource.axd" verb="GET,DEBUG" type="System.Web.Handlers.AssemblyResourceLoader" modules="ManagedPipelineHandler" scriptProcessor="" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false" 
 
    preCondition="integratedMode,runtimeVersionv4.0" responseBufferLimit="4194304" /> 
 
    <add name="PageHandlerFactory-Integrated-4.0" path="*.aspx" verb="GET,HEAD,POST,DEBUG" type="System.Web.UI.PageHandlerFactory" modules="ManagedPipelineHandler" scriptProcessor="" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false" 
 
    preCondition="integratedMode,runtimeVersionv4.0" responseBufferLimit="4194304" /> 
 
    <add name="SimpleHandlerFactory-Integrated-4.0" path="*.ashx" verb="GET,HEAD,POST,DEBUG" type="System.Web.UI.SimpleHandlerFactory" modules="ManagedPipelineHandler" scriptProcessor="" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false" 
 
    preCondition="integratedMode,runtimeVersionv4.0" responseBufferLimit="4194304" /> 
 
    <add name="WebServiceHandlerFactory-Integrated-4.0" path="*.asmx" verb="GET,HEAD,POST,DEBUG" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" modules="ManagedPipelineHandler" 
 
    scriptProcessor="" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false" preCondition="integratedMode,runtimeVersionv4.0" responseBufferLimit="4194304" /> 
 
    <add name="HttpRemotingHandlerFactory-rem-Integrated-4.0" path="*.rem" verb="GET,HEAD,POST,DEBUG" type="System.Runtime.Remoting.Channels.Http.HttpRemotingHandlerFactory, System.Runtime.Remoting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" 
 
    modules="ManagedPipelineHandler" scriptProcessor="" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false" preCondition="integratedMode,runtimeVersionv4.0" responseBufferLimit="4194304" /> 
 
    <add name="HttpRemotingHandlerFactory-soap-Integrated-4.0" path="*.soap" verb="GET,HEAD,POST,DEBUG" type="System.Runtime.Remoting.Channels.Http.HttpRemotingHandlerFactory, System.Runtime.Remoting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" 
 
    modules="ManagedPipelineHandler" scriptProcessor="" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false" preCondition="integratedMode,runtimeVersionv4.0" responseBufferLimit="4194304" /> 
 
    <add name="aspq-Integrated-4.0" path="*.aspq" verb="GET,HEAD,POST,DEBUG" type="System.Web.HttpForbiddenHandler" modules="ManagedPipelineHandler" scriptProcessor="" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false" preCondition="integratedMode,runtimeVersionv4.0" 
 
    responseBufferLimit="4194304" /> 
 
    <add name="cshtm-Integrated-4.0" path="*.cshtm" verb="GET,HEAD,POST,DEBUG" type="System.Web.HttpForbiddenHandler" modules="ManagedPipelineHandler" scriptProcessor="" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false" preCondition="integratedMode,runtimeVersionv4.0" 
 
    responseBufferLimit="4194304" /> 
 
    <add name="cshtml-Integrated-4.0" path="*.cshtml" verb="GET,HEAD,POST,DEBUG" type="System.Web.HttpForbiddenHandler" modules="ManagedPipelineHandler" scriptProcessor="" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false" preCondition="integratedMode,runtimeVersionv4.0" 
 
    responseBufferLimit="4194304" /> 
 
    <add name="vbhtm-Integrated-4.0" path="*.vbhtm" verb="GET,HEAD,POST,DEBUG" type="System.Web.HttpForbiddenHandler" modules="ManagedPipelineHandler" scriptProcessor="" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false" preCondition="integratedMode,runtimeVersionv4.0" 
 
    responseBufferLimit="4194304" /> 
 
    <add name="vbhtml-Integrated-4.0" path="*.vbhtml" verb="GET,HEAD,POST,DEBUG" type="System.Web.HttpForbiddenHandler" modules="ManagedPipelineHandler" scriptProcessor="" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false" preCondition="integratedMode,runtimeVersionv4.0" 
 
    responseBufferLimit="4194304" /> 
 
    <add name="ScriptHandlerFactoryAppServices-Integrated-4.0" path="*_AppService.axd" verb="*" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" modules="ManagedPipelineHandler" 
 
    scriptProcessor="" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false" preCondition="integratedMode,runtimeVersionv4.0" responseBufferLimit="4194304" /> 
 
    <add name="ScriptResourceIntegrated-4.0" path="*ScriptResource.axd" verb="GET,HEAD" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" modules="ManagedPipelineHandler" 
 
    scriptProcessor="" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false" preCondition="integratedMode,runtimeVersionv4.0" responseBufferLimit="4194304" /> 
 
    <add name="AXD-ISAPI-4.0_32bit" path="*.axd" verb="GET,HEAD,POST,DEBUG" type="" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false" 
 
    preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" /> 
 
    <add name="PageHandlerFactory-ISAPI-4.0_32bit" path="*.aspx" verb="GET,HEAD,POST,DEBUG" type="" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false" 
 
    preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" /> 
 
    <add name="SimpleHandlerFactory-ISAPI-4.0_32bit" path="*.ashx" verb="GET,HEAD,POST,DEBUG" type="" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false" 
 
    preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" /> 
 
    <add name="WebServiceHandlerFactory-ISAPI-4.0_32bit" path="*.asmx" verb="GET,HEAD,POST,DEBUG" type="" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" 
 
    allowPathInfo="false" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" /> 
 
    <add name="HttpRemotingHandlerFactory-rem-ISAPI-4.0_32bit" path="*.rem" verb="GET,HEAD,POST,DEBUG" type="" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" 
 
    allowPathInfo="false" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" /> 
 
    <add name="HttpRemotingHandlerFactory-soap-ISAPI-4.0_32bit" path="*.soap" verb="GET,HEAD,POST,DEBUG" type="" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" 
 
    allowPathInfo="false" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" /> 
 
    <add name="aspq-ISAPI-4.0_32bit" path="*.aspq" verb="*" type="" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false" preCondition="classicMode,runtimeVersionv4.0,bitness32" 
 
    responseBufferLimit="0" /> 
 
    <add name="cshtm-ISAPI-4.0_32bit" path="*.cshtm" verb="GET,HEAD,POST,DEBUG" type="" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false" 
 
    preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" /> 
 
    <add name="cshtml-ISAPI-4.0_32bit" path="*.cshtml" verb="GET,HEAD,POST,DEBUG" type="" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false" 
 
    preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" /> 
 
    <add name="vbhtm-ISAPI-4.0_32bit" path="*.vbhtm" verb="GET,HEAD,POST,DEBUG" type="" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false" 
 
    preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" /> 
 
    <add name="vbhtml-ISAPI-4.0_32bit" path="*.vbhtml" verb="GET,HEAD,POST,DEBUG" type="" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false" 
 
    preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" /> 
 
    <add name="TRACEVerbHandler" path="*" verb="TRACE" type="" modules="ProtocolSupportModule" scriptProcessor="" resourceType="Unspecified" requireAccess="None" allowPathInfo="false" preCondition="" responseBufferLimit="4194304" /> 
 
    <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG" type="" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false" 
 
    preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" /> 
 
    <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG" type="" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false" 
 
    preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" /> 
 
    <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG" type="System.Web.Handlers.TransferRequestHandler" modules="ManagedPipelineHandler" scriptProcessor="" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false" 
 
    preCondition="integratedMode,runtimeVersionv4.0" responseBufferLimit="0" /> 
 
    <add name="StaticFile" path="*" verb="*" type="" modules="StaticFileModule,DefaultDocumentModule,DirectoryListingModule" scriptProcessor="" resourceType="Either" requireAccess="Read" allowPathInfo="false" preCondition="" responseBufferLimit="4194304" 
 
    /> 
 
</handlers>

Il secondo modo è da rispondere al verbo OPZIONI HTTP nel metodo BeginRequest.

protected void Application_BeginRequest(object sender, EventArgs e) 
{ 
    HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*"); 
    if (HttpContext.Current.Request.HttpMethod == "OPTIONS") 
    { 
     HttpContext.Current.Response.AddHeader("Access-Control-Request-Method", "GET ,POST, PUT, DELETE"); 

     HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Origin,Content-Type, Accept"); 
     HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "86400"); // 24 hours 
     HttpContext.Current.Response.End(); 
    } 
} 
3

La soluzione per me è stato quello di aggiungere:

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

Per il mio web.config

0

Una cosa che non è stato menzionato in queste risposte è che se si utilizza IIS e hanno applicazioni secondarie con il proprio web.config separato, potrebbe essere necessario avere un web.config nella directory superiore contenente il seguente codice.

<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="POST,GET,OPTIONS"/> 
    </customHeaders> 
</httpProtocol> 
Problemi correlati