2013-07-06 7 views
15

Ben bu yazı şu denedim ama oldukça hala orada değilim: Benim web.config içindeWebAPI PUT/POST istekleri ile CORS'i etkinleştirme?

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

Ben şu var:

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

Ama chrome ben yaptığınızda

enter image description here

Benim isteği görünüyor: bir POST isteği ben izin verilmiyor hatası alıyorum Böyle:

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

apiEndpoint localhost üzerinde ancak farklı bir port üzerinde - istemci ve API projeleri farklı çözümler vardır.

POST isteği sonuçta sunucuya doğru gidiyor, ancak her zaman OPTIONS ile ilgili bir hata alıyorum ve bu nedenle istemciye hiçbir zaman bir çerez alamıyorum.

Ben WebAPI çalışma ile CORS'yi almaya çalışırken son birkaç saat geçirdim:

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

Ancak bazı montaj sürüm sorunları bana her şeyi dışarı Kopyalama yol açtı - umarım daha basit bir çözüm var.

cevap

23

POST, PUT, DELETE vb. Uçuş öncesi CORS kullanın. Tarayıcı bir OPTIONS isteği gönderir. OPTIONS'u işleyen bir işlem yönteminiz olmadığından, 405 alıyorsunuz. En basit haliyle, denetleyicinizde bunun gibi bir eylem yöntemi uygulamanız gerekir. Unutulmaması gereken

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

Bir şey web.config'de yapılandırmış customHeaders zaten gerekli Access-Control-Allow-Origin ve Access-Control-Allow-Methods başlıkları ekleyecek olmasıdır. Yani eylem yöntemi aynı şeyi yapmıyor.

Denetleyici işlemlerinde uygulama eylemi uygulanması ancak iyi bir seçenek olmayabilir. Bunu sizin için yapan bir mesaj işleyiciyi uygulamak daha iyi bir seçenek olacaktır. CORS'i etkinleştirmek için thinktecture kimlik modelini kullanmak daha iyi bir seçenek olacaktır. Web API 2, CORS desteği yerleşiktir (ttidm'den alınmıştır).

+1

Teşekkür ederim Badri. Bu beni bir adım öteye itti! – SB2055

+1

Bunu denetleyicide nasıl uygularsınız? –

+0

Imo POST ön kontrol isteği yaratmıyor –