2013-07-06 4 views
15

Ich habe nach diesem Beitrag versucht, aber ich bin ziemlich immer noch nicht da:Aktivieren von CORS mit WebAPI PUT/POST-Anfragen?

CORS support for PUT and DELETE with ASP.NET Web API

In meinem web.config habe ich folgendes:

<system.webServer> 
    <validation validateIntegratedModeConfiguration="false" /> 
    <httpProtocol> 
     <customHeaders> 
     <!-- TODO: don't let anyone make requests - only approved clients --> 
     <add name="Access-Control-Allow-Origin" value="*" /> 
     <add name="Access-Control-Allow-Headers" value="Content-Type" /> 
     <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" /> 
     </customHeaders> 
    </httpProtocol> 
    <handlers> 
     <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" /> 
     <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" /> 
     <remove name="ExtensionlessUrlHandler-Integrated-4.0" /> 
     <remove name="WebDAV" /> 
     <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" /> 
     <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" /> 
     <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" /> 
    </handlers> 
    <modules runAllManagedModulesForAllRequests="true"> 
     <remove name="WebDAVModule"/> 
    </modules> 
    </system.webServer> 

Aber in Chrom, wenn ich machen eine Anforderung POST erhalte ich den Fehler erlaubt nicht:

enter image description here

Meine Anfrage Blicke dies wie:

var request = $.ajax({ 
      async: true, 
      url: apiEndpoint + 'api/login', 
      type: 'POST', 
      data: JSON.stringify(data), 
      contentType: "application/json; charset=utf-8", 
      dataType: 'json' 
     }) 

apiEndpoint ist auf localhost, aber auf einem anderen Port - der Client und api-Projekte sind in verschiedenen Lösungen.

Die POST-Anfrage geht schließlich auf den Server, aber ich bekomme immer einen Fehler in Bezug auf OPTIONS und ich bekomme nie einen Cookie auf dem Client gespeichert.

verbrachte ich die letzten paar Stunden versucht CORS mit WebAPI Funktion zu erhalten:

https://aspnetwebstack.codeplex.com/wikipage?title=CORS%20support%20for%20ASP.NET%20Web%20API

Aber einige Montage Versionierung Probleme führten zu mir alles heraus zerren - hoffentlich gibt es eine einfachere Lösung.

Antwort

23

POST, PUT, DELETE usw. verwenden vorgelagerte CORS. Der Browser sendet eine OPTIONS-Anfrage. Da Sie keine Aktionsmethode haben, die OPTIONS handhabt, erhalten Sie eine 405. In ihrer einfachsten Form müssen Sie eine solche Aktionsmethode in Ihrem Controller implementieren.

public HttpResponseMessage Options() 
{ 
    var response = new HttpResponseMessage(); 
    response.StatusCode = HttpStatusCode.OK; 
    return response; 
} 

Eine Sache zu beachten ist, dass die Custom Sie in web.config konfiguriert haben, werden bereits die notwendigen Access-Control-Allow-Origin und Access-Control-Allow-Methods Header hinzufügen. Also macht die Aktionsmethode nicht dasselbe.

Das Implementieren der Aktionsmethode im Controller funktioniert möglicherweise nicht, ist jedoch keine gute Option. Eine bessere Option wird die Implementierung eines Nachrichtenhandlers sein, der dies für Sie erledigt. Eine viel bessere Option wird Thinktecture Identity Model verwenden, um CORS zu aktivieren. Web API 2 hat CORS Unterstützung eingebaut (aus Ttidm).

+1

Danke Badri. Das hat mich einen Schritt weiter getrieben! – SB2055

+1

Wie würden Sie dies in der Steuerung implementieren? –

+0

Imo POST erstellt keine Preflight-Anfrage –