2013-07-18 3 views
22

Ich habe eine Menge Probleme beim Erhalten einer domainübergreifenden POST-Anfrage, um einen Api-Controller in der neuesten Beta 2-Version zu treffen.CORS POST Requests funktioniert nicht - OPTIONS (Bad Request) - Der Ursprung ist nicht erlaubt

Chrome (und andere Browser) ausspucken:

OPTIONS http://api.hybridwebapp.com/api/values 400 (Bad Request) 
POST http://api.hybridwebapp.com/api/values 404 (Not Found) 

Es zu this issue in Zusammenhang stehen können, aber ich habe das Problem zu umgehen und einige andere Korrekturen wie web.config angewendet additions here

ich waren Ich knallte meinen Kopf damit für eine Weile und so schuf ich eine Lösung, um das Problem genau zu reproduzieren.

Laden Sie die Web-App gibt es 2 Tasten eine für GET eins für POST und die Antwort wird neben der Schaltfläche angezeigt. GET funktioniert. POST kann nicht erfolgreich zurückgegeben werden.

enter image description here

Ich bin in der Lage einen Hinweis auf die Ursache von Fiddler zu bekommen, aber es macht keinen Sinn, weil wenn man sich die Antwort sieht es die Domain in der Include-Access-Controll--Allow-Origin-Header:

enter image description here

es gibt einen Ordner in der Lösung „ConfigurationScreenshots“ mit ein paar Screenshots der IIS-Konfiguration (Website-Bindungen) und Projekteigenschaften Konfigurationen machen es so einfach wie möglich, mir zu helfen :)

genannt ist

EDIT: Vergessen Sie nicht, diesen Eintrag hinzufügen Datei Host (% SystemRoot% \ system32 \ drivers \ etc):

127.0.0.1  hybridwebapp.com api.hybridwebapp.com 

** STATUS: ** Es scheint, dass einige Browser wie Chrome mir erlauben um mit dem POST fortzufahren, unabhängig von der Fehlermeldung in der OPTIONS-Antwort (während andere wie Firefox dies nicht tun). Aber ich halte das nicht für gelöst.

Schauen Sie sich die Fidler Screenshots der OPTIONS-Anforderung hat

Access-Control-Allow-Origin: http://hybridwebapp.com

Und doch den Fehler:

Der Ursprung http://hybridwebapp.com ist nicht erlaubt

Das ist völlig widersprüchlich, als ob es den Header ignoriert.

+0

Können Sie die Header für die POST-Anfrage auch einschließen? Das Preflight ist auch seltsam: Es gibt eine 400 mit einer Fehlermeldung im Hauptteil zurück, aber es gibt auch die korrekten CORS-Header zurück, so dass das Preflight erfolgreich ist (wie durch die Tatsache, dass es von einer POST-Anfrage gefolgt wird). – monsur

+0

Hinzugefügt. Danke für einen Blick. – parliament

+1

Ich glaube, du könntest mit einem bekannten Problem konfrontiert werden, das nach der Beta behoben wurde. Der Kommentar des folgenden Fehlers hat den Link zu dem Update: http: //aspnetwebstack.codeplex.com/workitem/1050 –

Antwort

21

Ok, ich habe es hinter mir. Das muss das seltsamste Problem sein, dem ich je begegnet bin. Hier ist, wie zu „lösen“ es:

  1. Fahren Sie mit Leben wie gewohnt bis plötzlich aus dem Nichts OPTIONS-Anforderungen an diese Domäne 200 OK beginnen Rückkehr (statt 400 Bad Request) und POST nie passiert (oder zumindest scheint es nicht, weil der Browser es schluckt)
  2. Erkennen Sie, dass Fiddlers Antwort OPTIONS auf mysteriöse Weise Duplikate für "Access-Control-Allow-XXX" enthält.
  3. Versuchen Sie, die folgende Aussage aus Ihrem Web zu entfernen.Config obwohl Sie klar versuchen, daran erinnern, dass das vorherige Problem zu beheben, und es funktioniert nicht:

diese entfernen:

var enableCorsAttribute = new EnableCorsAttribute("http://mydomain.com", 
                "Origin, Content-Type, Accept", 
                "GET, PUT, POST, DELETE, OPTIONS"); 
     config.EnableCors(enableCorsAttribute); 

Moral:

<httpProtocol> 
     <customHeaders> 
     <remove name="X-Powered-By" /> 
     <add name="Access-Control-Allow-Origin" value="http://mydomain.com" /> 
     <add name="Access-Control-Allow-Headers" value="Accept, Content-Type, Origin" /> 
     <add name="Access-Control-Allow-Methods" value="GET, PUT, POST, DELETE, OPTIONS" /> 
     </customHeaders> 
    </httpProtocol> 

Da Sie bereits das haben Sie brauche nur einen.

+0

Für Web-API mit OWINS können wir den OAuthAuthorizationServerProvider zu verwenden Erledigen Sie die Preflight- und tatsächlichen Anfragen. Dies sollte der einzige Bereich sein, in dem die Header basierend auf dem Origin-Wert hinzugefügt werden (falls erlaubt). Weitere Informationen finden Sie in diesem Artikel: http://www.ozkary.com/2016/04/web-api-owin-cors-handling- no-access.html – ozkary

+0

Ich hatte ein Attribut [AllowCrossSiteJson], das meine CORS-Header machte, aber während ich an etwas anderem arbeitete, fügte ich OWin.Cors hinzu - dein Beitrag brachte mich auf den richtigen Weg! – agrath

0

Versuchen unter Code in Ihrer Antwort-Header hinzuzufügen:

Response.AddHeader("Access-Control-Allow-Origin", "*"); 
+3

Und Sicherheit ??? – pilau

+0

@pilau Sicherheit würde von Owin gehandhabt werden. Sie würden Token usw. verwenden. – devlord

+0

@lorddev Noch nie von Owin gehört. Will hineinschauen. Vielen Dank. – pilau

11

, wenn Sie verwenden OAuth Autorisierung. Anfrage nicht direkt auf Web-API gehen. Sie müssen die OWIN CORS-Unterstützung für diesen Endpunkt aktivieren.

Wie ich auf meiner Seite tun: installieren owin cors

Install-Package Microsoft.Owin.Cors 

Hinweis: bitte nicht verwenden: Install-Package Microsoft.AspNet.WebApi.Cors

In Datei Startup.Auth.cs

//add this line 
      app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll); 

      // Enable the application to use bearer tokens to authenticate users 
      app.UseOAuthBearerTokens(OAuthOptions); 
+0

Warum sollte man Microsoft.AspNet.WebApi.Cors nicht verwenden? Was ist der Unterschied zwischen den beiden Paketen? – LavaHot

+2

Frage ich verstehe, Microsoft.Owin.Cors ist erlaubt cors für alle (Webapi, MVC-Steuerelement ...), WebApi.Cors ist nur für WebApi einstellen. –

-1

I habe einen MVC-Controller (kein ApiController), aber die Lösung, die ich entwickelt habe, könnte anderen helfen. Damit Cross-Domain-Zugriff auf eine POST-Aktion (/data/xlsx) auf dem Controller implementiert I 2 Aktionen:

  1. für die Vorflugcheck
  2. für den Posten

Wenn Sie nicht haben die Aktion HttpOptions, dann erhalten Sie 404 auf dem Pre-Flight-Check.

Code:

[HttpOptions] 
public ActionResult Xlsx() 
{ 
    // Catches and authorises pre-flight requests for /data/xlsx from remote domains 
    Response.AddHeader("Access-Control-Allow-Origin", "*"); 
    Response.AddHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept"); 
    Response.AddHeader("Access-Control-Allow-Methods", "GET, PUT, POST, DELETE, OPTIONS"); 
    return null; 
} 

[HttpPost] 
public ActionResult Xlsx(string data, string name) 
{ 
    Xlsx(); // Add CORS headers 

    /* ... implementation here ... */ 
} 

Ich habe es in IE getestet 11, Chrome, FireFox.

+0

Downvoted. Verwenden Sie Filter und verwenden Sie MVC/Web API, wie es entwickelt wurde. Fügen Sie keine Anforderungsheaderinformationen in einer Aktion hinzu. –

+0

Um genauer zu sein, warum ich das downvoted: Verwenden Sie einen Filter, wenn Sie die Request/Response-Pipeline ändern möchten. Dies hält Ihre Controller-Aktionen sauber und sorgt für eine Trennung von Bedenken in Ihrer Anwendung. Zweitens, warum Sie CORS in MVC verwenden möchten, ist auch diskussionswürdig, Web Api ist besser geeignet für reine Content-Dienste. Es gibt einen Grund, warum Dokumente auf CORS für MVC begrenzt sind. Für Web Api schauen Sie sich den Enable Cors Filter und http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api und https: //docs.asp an. net/de/latest/security/cors.html # setting-up-cors –

+0

Nachlesen von Filtern, jeder Aufruf der AddHeader-Methode kann aus der Controller-Aktion entfernt werden, was zu genau demselben Verhalten führt, aber zu saubereren Controllern. Der Cors-Code ist auch in Ihrer gesamten Anwendung wiederverwendbar. Aber wenn Sie wissen, was Sie tun, werde ich nicht versuchen, Sie noch weiter zu überzeugen. Komisch, dass du in einem Forum herumirrst und nicht willst, dass die Leute dir einen Rat geben? Deine Antwort ist zu 100% nicht so, wie MVC es will. Es macht mir nichts aus, dass es dir egal ist, aber stelle es nicht als Antwort auf ein öffentliches Forum zur Verfügung, da es nicht für eine korrekte MVC-Entwicklung geeignet ist. –

0

Fügen Sie diese auf Ihre startup.cs Datei in ConfigureOAuth

app.UseCors (Microsoft.Owin.Cors.CorsOptions.AllowAll);

Verwandte Themen