CORS post mit preflight-request
Ich versuche zum hochladen von Dateien auf einen Dienst auf einer anderen domain mit CORS, aber Sie halten nicht wegen der Herkunft verweigert. Soweit ich sehen kann, die richtigen Header werden genutzt, um dies zu ermöglichen.
Javascript-Anfrage:
var xhr = new XMLHttpRequest();
xhr.open('POST', "https://files.example.com", true);
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.onreadystatechange = function () {
if (this.status == 200 && this.readyState == 4) {
console.log('response: ' + this.responseText);
}
};
xhr.send();
Antwort von den preflight-OPTIONS-Anforderung:
Access-Control-Allow-Headers:Origin, Authorization, Content-Type
Access-Control-Allow-Methods:POST, OPTIONS
Access-Control-Allow-Origin:*
Content-Length:0
Content-Type:application/json
Date:Mon, 19 Nov 2012 23:30:21 GMT
Header für POST-Requests:
Cache-Control:no-cache
Content-Type:application/json
Origin:https://www.example.com
Pragma:no-cache
Referer:https://www.example.com
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_0) AppleWebKit/537.19 (KHTML, like Gecko) Chrome/25.0.1325.0 Safari/537.19
Die Ergebnisse in der Fehlermeldung:
XMLHttpRequest cannot load https://files.example.com. Origin https://www.example.com is not allowed by Access-Control-Allow-Origin.
- Haben u got Lösung für dieses bin ich auch, die mit ähnlichen problem stackoverflow.com/questions/15094620/...
- Ist diese Anforderung credentialed? Wenn dem so ist, wird die Access-Control-Allow-Origin übereinstimmen muss die Herkunft (nicht verwenden können, wildcard).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Subdomains sind unterschiedlich. Soweit CORS betroffen ist die subdomain, Protokoll und port müssen identisch sein in den Ursprung und die Access-Control-Allow-Origin.
In deinem Beispiel sieht es aus wie die Herkunft ist: https://www.example.com
und die Access-Control-Allow-Origin ist: https://files.example.com
Leider Entsendung zu einer anderen Domäne als Ihrer Seite entlockt CORS. Dazu gehört auch, dass verschiedene subdomains, ports und Protokoll (http/https).
Preflight getan wird, wenn die Anforderung ist "nicht einfach", also ein content-type-header setzen auf etwas anderes als "text/plain". Ihr "application/json" lässt Browsern Angst bekommen, in Preflight.
Wenn diese 50-200 ms sind wichtig für Sie, dann Sie können schreiben Sie Ihre web-service zu verstehen, die "einfache" Inhalte geben. Wenn nicht, dann sollten Sie Ihre web-service-Wurf zurück HTTP-status 204 (no content), wenn er damit beauftragt ist, mit den OPTIONEN (http-Methode).
Beim Umgang mit wcf:
Versuchen Sie das hinzufügen der Cache-Control und Pragma auf der Liste der erlaubten Header in die "preflight". Den vollständigen header sollte dann so Aussehen:
Es ist etwas spät, aber ein Blick auf Ihre info zeigt es den pre-flight-CORS überprüfen Sie funktioniert OK, es ist nur die aktuelle (2.) CORS Anfrage, wo die Reaktion wird blockiert durch den browser.
Es ist schade, Sie haben keine Antwort auf die eigentlichen (2.) CORS Anfrage, denn vielleicht enthielt Sie den Hinweis für die Antwort auf Ablehnung. Mein Verdacht ist, dass, obwohl die pre-flight-Reaktion korrekt enthält die header:
... Ihre eigentlichen (2.) die Reaktion möglicherweise nicht enthalten, die header, in dem Fall der browser richtig weist die Antwort. Wenn meine Vermutung stimmt, die Lösung wäre nur gehört dieser header auch in der tatsächlichen (nicht pre-flight) Reaktion.