2013-07-06 11 views
15

Próbowałem po tym poście, ale nadal nie jestem całkiem tam:Włączanie CORS z żądaniami PAP/POST WebAPI?

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

W moim web.config mam następujący:

<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> 

Ale w chromie kiedy robię żądanie POST dostaję niedozwolone błąd:

enter image description here

moja prośba wygląda tak:

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

apiEndpoint jest na localhost, ale na innym porcie - projekty klienta i API są w różnych rozwiązaniach.

Żądanie POST ostatecznie trafia na serwer, ale zawsze pojawia się błąd związany z OPCJAMI i nigdy nie otrzymuję z tego powodu pliku cookie zapisanego na komputerze.

Spędziłem ostatnie kilka godzin próbując dostać CORS z pracy WebAPI:

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

Ale niektóre kwestie wersjonowania montażowe doprowadziło do mnie szarpać wszystkiego - mam nadzieję, że istnieje prostsze rozwiązanie.

Odpowiedz

23

POST, PUT, DELETE, itp. Używają przedlotowego CORS. Przeglądarka wysyła żądanie OPTIONS. Ponieważ nie masz metody działania, która obsługuje OPCJE, dostajesz 405. W najprostszej formie musisz wdrożyć taką metodę działania w swoim kontrolerze.

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

Jedną rzeczą jest, aby pamiętać, że customHeaders zostały skonfigurowane w pliku web.config będzie już dodając niezbędne Access-Control-Allow-Origin i Access-Control-Allow-Methods nagłówków. Tak więc metoda działania nie robi tego samego.

Implementacja metody działania w kontrolerze działa, ale może nie być dobrym rozwiązaniem. Lepszą opcją będzie implementacja obsługi komunikatów, która zrobi to za Ciebie. Znacznie lepszym rozwiązaniem będzie zastosowanie modelu tożsamości cienkowarstwowego w celu włączenia CORS. Web API 2 ma wsparcie CORS wbudowane (pobrane z ttidm).

+1

Dziękuję Badri. To pchnęło mnie o krok dalej! – SB2055

+1

W jaki sposób wdrożysz to w kontrolerze? –

+0

Imo POST nie tworzy żądania preflight –

Powiązane problemy