Ich habe kürzlich Javascript-Anfragen an eine andere Domain gesendet. Standardmäßig ist die XHR-Veröffentlichung in anderen Domains nicht zulässig.
Nach den Anweisungen von http://enable-cors.org/ habe ich dies für die andere Domain aktiviert.
<?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>
Jetzt funktioniert alles einwandfrei, es wird jedoch immer noch eine 405-Antwort zurückgegeben, bevor die funktionierende 200-Antwort zurückgesendet wird.
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
Update: 02.03.2014
Es gibt einen kürzlich aktualisierten Artikel im MSDN-Magazin. Detaillierte Informationen zur CORS-Unterstützung in der ASP.NET-Web-API 2.
javascript
iis-7
xmlhttprequest
cors
Andrew
quelle
quelle
Antworten:
Es ist wahrscheinlich, dass IIS 7 die HTTP OPTIONS-Antwort "verarbeitet", anstatt dass Ihre Anwendung sie angibt. Um dies festzustellen, wird in IIS7
Gehen Sie zu den Handler-Zuordnungen Ihrer Site.
Scrollen Sie nach unten zu 'OPTIONSVerbHandler'.
Ändern Sie das 'ProtocolSupportModule' in 'IsapiHandler'.
Legen Sie die ausführbare Datei fest:% windir% \ Microsoft.NET \ Framework \ v4.0.30319 \ aspnet_isapi.dll
Jetzt sollten Ihre obigen Konfigurationseinträge aktiviert werden, wenn ein HTTP OPTIONS-Verb gesendet wird.
Alternativ können Sie in Ihrer BeginRequest-Methode auf das Verb HTTP OPTIONS antworten.
quelle
Application_BeginRequest
die einzige Möglichkeit für mich, das Problem zu beheben. Ich habe andere Methoden mitcustomHeaders
( stackoverflow.com/a/19091291/827168 ), Entfernen des Handlers , EntfernenOPTIONSVerbHandler
vonWebDAV
Modul und Handler ( stackoverflow.com/a/20705500/827168 ) ausprobiert, aber keine hat bei mir funktioniert. Hoffe das wird anderen Menschen helfen. Und danke @Mendhak für deine Antwort!HttpContext.Current.Response.AddHeader("Access-Control-Allow-Credentials", "true");
gemeinsames Authentifizierungs-Cookie.Ich kann keine Kommentare posten, daher muss ich dies in eine separate Antwort einfügen, aber es hängt mit der akzeptierten Antwort von Shah zusammen.
Ich folgte zunächst Shahs Antwort (danke!), Indem ich den OPTIONSVerbHandler in IIS neu konfigurierte, aber meine Einstellungen wurden wiederhergestellt, als ich meine Anwendung erneut bereitstellte.
Am Ende habe ich stattdessen den OPTIONSVerbHandler in meiner Web.config entfernt.
quelle
Ich fand die Informationen unter http://help.infragistics.com/Help/NetAdvantage/jQuery/2013.1/CLR4.0/html/igOlapXmlaDataSource_Configuring_IIS_for_Cross_Domain_OLAP_Data.html sehr hilfreich beim Einrichten von HTTP OPTIONS für einen HTTP OPTIONS in einem HTTP OPTIONS.
Ich habe Folgendes zu meiner web.config hinzugefügt und dann den OPTIONSVerbHandler in der IIS 7-Liste "Hander-Mappings" an den Anfang der Liste verschoben. Ich habe dem OPTIONSVerbHander auch Lesezugriff gewährt, indem ich auf den Hander im Abschnitt Handler-Zuordnungen doppelklickte, dann auf "Anforderungsbeschränkungen" und dann auf die Registerkarte "Zugriff" klickte.
Leider stellte ich schnell fest, dass der IE das Hinzufügen von Headern zu ihrem XDomainRequest- Objekt nicht zu unterstützen scheint (Setzen des Inhaltstyps auf text / xml und Hinzufügen eines SOAPAction-Headers).
Ich wollte dies nur teilen, da ich den größten Teil eines Tages damit verbracht habe, nach einem Umgang damit zu suchen.
quelle
<add name="Access-Control-Allow-Origin" value="http://my.origin.host" />
Die Antwort 405 ist eine Antwort "Methode nicht zulässig". Es hört sich so an, als ob Ihr Server nicht richtig für die Verarbeitung von CORS-Preflight-Anforderungen konfiguriert ist. Sie müssen zwei Dinge tun:
1) Aktivieren Sie IIS7, um auf HTTP OPTIONS-Anforderungen zu antworten. Sie erhalten den 405, weil IIS7 die OPTIONS-Anforderung ablehnt. Ich weiß nicht, wie ich das machen soll, da ich mit IIS7 nicht vertraut bin, aber es gibt wahrscheinlich andere auf Stack Overflow, die das tun.
2) Konfigurieren Sie Ihre Anwendung so, dass sie auf CORS-Preflight-Anfragen reagiert. Sie können dies tun, indem Sie die folgenden zwei Zeilen unter der
Access-Control-Allow-Origin
Zeile im<customHeaders>
Abschnitt hinzufügen :Möglicherweise müssen Sie dem
Access-Control-Allow-Headers
Abschnitt andere Werte hinzufügen, je nachdem, nach welchen Headern Ihre Anfrage fragt. Haben Sie den Beispielcode für eine Anfrage?Weitere Informationen zu CORS und CORS Preflight finden Sie hier: http://www.html5rocks.com/en/tutorials/cors/
quelle
Ausarbeiten der DavidG-Antwort, die wirklich nahe an dem liegt, was für eine grundlegende Lösung erforderlich ist:
Konfigurieren Sie zunächst den OPTIONSVerbHandler so, dass er vor .NET-Handlern ausgeführt wird.
Sie können dies auch in web.config tun, indem Sie alle Handler unter neu definieren
<system.webServer><handlers>
(<clear>
dann<add ...>
wieder zurück, dies ist, was die IIS-Konsole für Sie tut) (Übrigens müssen Sie für diesen Handler nicht nach einer Leseberechtigung fragen.)Zweitens konfigurieren Sie benutzerdefinierte http-Header für Ihre Cors-Anforderungen, z.
Sie können dies auch in der IIS-Konsole tun.
Dies ist eine grundlegende Lösung, da Cors-Header auch auf Anfrage gesendet werden, ohne dass dies erforderlich ist. Aber mit WCF sieht es so aus, als wäre es das einfachste.
Mit MVC oder Webapi könnten wir stattdessen OPTIONS Verb- und Cors-Header per Code behandeln (entweder "manuell" oder mit integrierter Unterstützung, die in der neuesten Version von Webapi verfügbar ist).
quelle
Installieren Sie mit ASP.net Web API 2 die Unterstützung von Microsoft ASP.NET Cross Origin über Nuget.
http://enable-cors.org/server_aspnet.html
quelle
programmatically
den ersten "ORIGIN" -Parameter von einzustellenEnableCorsAttribute
? Sagen wir nicht hier im Register, sondern für jede einzelne eingehende HTTP-Anfrage. Ermitteln Sie den Ursprung, von dem er stammt, stellen Sie sicher, dass er in Ordnung ist (überprüfen Sie ihn anhand einer Liste genehmigter), und geben Sie dann eine Antwort mit zurückAccess-Allow-Control-Origin="thatdomain.com"
. @ AndrewDie Lösung für mich war hinzuzufügen:
Zu meiner web.config
quelle
Alsalaam Aleykum.
Der erste Weg ist, den Anweisungen in diesem Link zu folgen:
http://help.infragistics.com/Help/NetAdvantage/jQuery/2013.1/CLR4.0/html/igOlapXmlaDataSource_Configuring_IIS_for_Cross_Domain_OLAP_Data.html
Welches entspricht dieser Konfiguration:
Die zweite Möglichkeit besteht darin, auf das Verb HTTP OPTIONS in Ihrer BeginRequest-Methode zu antworten.
quelle
Microsoft hat Jahre gebraucht, um die Lücken zu identifizieren und ein Out-of-Band-CORS-Modul zu liefern, um dieses Problem zu lösen.
wie nachstehend
Im Allgemeinen ist es viel einfacher als Ihre benutzerdefinierten Header und bietet auch eine bessere Bearbeitung von Preflight-Anfragen.
quelle
Eine Sache, die in diesen Antworten nicht erwähnt wurde, ist, dass Sie, wenn Sie IIS verwenden und Unteranwendungen mit einer eigenen separaten web.config haben, möglicherweise eine web.config im übergeordneten Verzeichnis haben müssen, die den folgenden Code enthält.
quelle