Ich habe eine einfache Aktionsmethode, die etwas json zurückgibt. Es läuft auf ajax.example.com. Ich muss von einer anderen Site someothersite.com darauf zugreifen.
Wenn ich versuche es anzurufen, bekomme ich das erwartete ...:
Origin http://someothersite.com is not allowed by Access-Control-Allow-Origin.
Ich kenne zwei Möglichkeiten, um dies zu umgehen : JSONP und das Erstellen eines benutzerdefinierten HttpHandlers zum Festlegen des Headers.
Gibt es keinen einfacheren Weg?
Ist es für eine einfache Aktion nicht möglich, entweder eine Liste der zulässigen Ursprünge zu definieren - oder einfach alle zuzulassen? Vielleicht ein Aktionsfilter?
Optimal wäre ...:
return json(mydata, JsonBehaviour.IDontCareWhoAccessesMe);
json
asp.net-mvc-3
cors
asp.net-ajax
Kjensen
quelle
quelle
Antworten:
Für einfache ASP.NET MVC-Controller
Erstellen Sie ein neues Attribut
Kennzeichnen Sie Ihre Aktion:
Für die ASP.NET-Web-API
Kennzeichnen Sie einen ganzen API-Controller:
Oder einzelne API-Aufrufe:
Für Internet Explorer <= v9
IE <= 9 unterstützt CORS nicht. Ich habe ein Javascript geschrieben, das diese Anfragen automatisch über einen Proxy weiterleitet. Es ist alles 100% transparent (Sie müssen nur meinen Proxy und das Skript einschließen).
Laden Sie es mit nuget herunter
corsproxy
und befolgen Sie die beiliegenden Anweisungen.Blogbeitrag | Quellcode
quelle
Wenn Sie IIS 7+ verwenden, können Sie eine web.config-Datei im Stammverzeichnis des Ordners im Abschnitt system.webServer ablegen:
Siehe: http://msdn.microsoft.com/en-us/library/ms178685.aspx Und: http://enable-cors.org/#how-iis7
quelle
Ich stieß auf ein Problem, bei dem der Browser sich weigerte, Inhalte bereitzustellen, die er abgerufen hatte, als die Anfrage in Cookies übergeben wurde (z. B. das xhr hatte seine
withCredentials=true
), und die Site aufAccess-Control-Allow-Origin
eingestellt hatte*
. (Der Fehler in Chrome war: "Platzhalter in Access-Control-Allow-Origin kann nicht verwendet werden, wenn das Flag für Anmeldeinformationen wahr ist.")Aufbauend auf der Antwort von @jgauffin habe ich dies erstellt. Dies ist im Grunde eine Möglichkeit, diese bestimmte Browsersicherheitsprüfung zu umgehen, also Vorbehalt.
quelle
Das ist wirklich einfach, fügen Sie dies einfach in web.config hinzu
Fügen Sie in Origin alle Domänen ein, die Zugriff auf Ihren Webserver haben, in Header alle möglichen Header, die jede Ajax-HTTP-Anforderung verwenden kann, und in Methoden alle Methoden, die Sie auf Ihrem Server zulassen
Grüße :)
quelle
Manchmal verursacht auch das Verb OPTIONEN Probleme
Einfach: Aktualisieren Sie Ihre web.config wie folgt
Und aktualisieren Sie die Webservice / Controller-Header mit httpGet und httpOptions
quelle
WebAPI 2 verfügt jetzt über ein Paket für CORS, das mithilfe des Installationspakets Microsoft.AspNet.WebApi.Cors -pre -project WebServic installiert werden kann
Befolgen Sie nach der Installation den folgenden Code: http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api
quelle
Fügen Sie diese Zeile Ihrer Methode hinzu, wenn Sie eine API verwenden.
quelle
Dieses Tutorial ist sehr nützlich. Um eine kurze Zusammenfassung zu geben:
Verwenden Sie das auf Nuget verfügbare CORS-Paket:
Install-Package Microsoft.AspNet.WebApi.Cors
Fügen Sie in Ihrer
WebApiConfig.cs
Dateiconfig.EnableCors()
derRegister()
Methode hinzu.Fügen Sie den Controllern, die Sie für die Verarbeitung von Cors benötigen, ein Attribut hinzu:
[EnableCors(origins: "<origin address in here>", headers: "*", methods: "*")]
quelle
quelle
Eine andere Möglichkeit besteht darin, Code wie folgt in die Datei webApiconfig.cs einzufügen.
config.EnableCors (neues EnableCorsAttribute (" ", Header: " ", Methoden: "*", exponierte Header: "TestHeaderToExpose") {SupportsCredentials = true});
Oder wir können den folgenden Code in die Global.Asax-Datei einfügen.
Ich habe es für die Optionen geschrieben. Bitte ändern Sie das gleiche nach Ihren Wünschen.
Viel Spaß beim Codieren !!
quelle
Nachdem ich einen ganzen Abend gekämpft hatte, brachte ich das endlich zum Laufen. Nach einigem Debuggen stellte ich fest, dass mein Client eine sogenannte Preflight-Optionsanforderung sendete, um zu überprüfen, ob die Anwendung eine Postanforderung mit dem angegebenen Ursprung, den angegebenen Methoden und den angegebenen Headern senden durfte. Ich wollte weder Owin noch einen APIController verwenden, also begann ich zu graben und fand die folgende Lösung mit nur einem ActionFilterAttribute. Insbesondere der Teil "Access-Control-Allow-Headers" ist sehr wichtig, da die dort genannten Header mit den Headern übereinstimmen müssen, die Ihre Anfrage senden wird.
Schließlich sieht meine MVC-Aktionsmethode so aus. Wichtig ist hier auch, die Optionen HttpVerbs zu erwähnen, da sonst die Preflight-Anfrage fehlschlägt.
quelle
Geben Sie in Web.config Folgendes ein
quelle
Wenn Sie IIS verwenden, würde ich empfehlen, das IIS CORS-Modul auszuprobieren .
Es ist einfach zu konfigurieren und funktioniert für alle Arten von Controllern.
Hier ist ein Beispiel für die Konfiguration:
quelle
Ich verwende DotNet Core MVC und nachdem ich einige Stunden mit Nuget-Paketen, Startup.cs, Attributen und diesem Ort gekämpft habe, habe ich dies einfach der MVC-Aktion hinzugefügt:
Mir ist klar, dass dies ziemlich klobig ist, aber es ist alles, was ich brauchte, und nichts anderes wollte diese Überschriften hinzufügen. Ich hoffe das hilft jemand anderem!
quelle