2015-11-04 129 views
10

我已經閱讀了StackOverflow中的許多類似問題,但該解決方案對我無效。針對預檢的響應具有無效的HTTP狀態代碼405

我有WCF REST服務:

[<OperationContract>]  
    [<WebInvoke(UriTemplate = "PostItem", 
      RequestFormat= WebMessageFormat.Json, 
      ResponseFormat = WebMessageFormat.Json, Method = "POST")>]   

我可以用郵差(Chrome擴展)使用它。我將數據傳遞爲「原始」,而不是「urlencoded」。我得到200個返回碼。

enter image description here

我需要使用angularjs調用這個方法:

$http.post('http://192.168.1.65/Service1.svc/restapi/PostItem',     
       { 
    "Address": "г. Москва, ул. Соколово-Мещерская, д.25", 
    ... 
    "User": "" 
     }) 

我剛纔複製的網址和JSON從郵差。但我得到的錯誤:

angular.js:10722 OPTIONS http://192.168.1.65/Service1.svc/restapi/PostItem http://192.168.1.65/Service1.svc/restapi/PostItem . Response for preflight has invalid HTTP status code 405

我已經尋找類似的問題,並發現兩個解決方案:

  1. 使用jQuery設置標題Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',但它並沒有與我的WCF服務
  2. 工作在我的web.config

    設置自定義標題:

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

它不能幫助我。我不確定服務器端的錯誤原因。郵遞員擴展可以成功調用此方法。

如何使用AngularJS進行相同的POST調用?

更新

這裏是OPTIONS請求:

enter image description here

審查和Response選項卡是空

更新2:

一切工作正常,在IE ,但不起作用Chrome瀏覽器。

+0

通常.Net將發送錯誤信息及405狀態碼......你有沒有收到? –

+0

我已更新我的問題,並在Chrome中添加此請求的屏幕。 – demas

+0

否,在您發佈的更新圖片中查看,選中「預覽」標籤 –

回答

6

看起來像我找到解決方案。我剛剛添加第二種方法:

[<OperationContract>]  
[<WebInvoke(UriTemplate = "PostTest", 
     RequestFormat= WebMessageFormat.Json, 
     ResponseFormat = WebMessageFormat.Json, Method = "POST")>]   
abstract PostTest: obj: Test -> unit 

[<OperationContract>]  
[<WebInvoke(UriTemplate = "PostTest", 
     RequestFormat= WebMessageFormat.Json, 
     ResponseFormat = WebMessageFormat.Json, Method = "OPTIONS")>]   
abstract PostTestOptions: unit -> unit 

這只是空白的方法,什麼都不做。我不知道原因,但一切正常。

+0

它的工作原理是因爲您的web.config中已經有customHeaders,它返回了COR期望的內容,但是您沒有允許OPTIONS的uriTemplate。因此,在創建了一個emtpy方法之後,預檢可以正常工作,並從customHeaders中獲取了已排除的標題。 –

+0

在嘗試了一個月的其他建議後,這個工作對我來說,開啓和關閉,沒有成功。 – quilkin

+0

這有效,但我認爲你可以將現有方法更改爲Method =「OPTIONS」而不重複。它仍會發布數據。 – masospaghetti

21

即使已關閉的問題,我想展示我的工作。

首先,您必須在網絡上啓用CORS。配置(如米哈伊傷心):

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

如果你有一些額外的頭參數,則必須將其添加到訪問控制,允許報頭,如:

<add name="Access-Control-Allow-Headers" value="Content-Type, X-Your-Extra-Header-Key" /> 

最後,處理OPTIONS請求您必須回覆空的響應,添加您的應用程序類:

protected void Application_BeginRequest() 
{ 
    if (Request.Headers.AllKeys.Contains("Origin") && Request.HttpMethod == "OPTIONS") 
    { 
     Response.Flush(); 
    } 
} 
+1

我越來越同樣的錯誤在ASP網絡API api 4.做什麼請建議 –

+0

我有時遇到了一些DLL文件損壞。你有辦法測試服務器是否有退貨嗎?它發生在你所做的每一個電話中,還是僅僅在某些情況下? –

+1

簡單的$ .ajax調用工作正常,但從$ http(angularjs模塊)發出請求時發出此錯誤..我發佈了一個關於此問題:http://stackoverflow.com/questions/37629422/angularjs-with -asp-net-web-api-http-post-returning-xmlhttprequest-can not-load?noredirect = 1#comment62740684_37629422 –

0

雖然這已經有一個答案,但是繼承人我的解決方案。 在web配置您必須刪除指令<remove name="OPTIONSVerbHandler" />

首先添加在customHeaders

<httpProtocol> 
    <!-- THESE HEADERS ARE IMPORTANT TO WORK WITH CORS --> 
    <customHeaders> 
    <add name="Access-Control-Allow-Origin" value="*" /> 
    <add name="Access-Control-Allow-Methods" value="POST, PUT, DELETE, GET, OPTIONS" /> 
    <add name="Access-Control-Allow-Headers" value="content-Type, accept, origin, X-Requested-With, X-Authentication, name" /> 
    </customHeaders> 
</httpProtocol> 

接着是被註釋掉或刪除指令刪除OPTIONSverbHandler

<handlers> 
    <remove name="ExtensionlessUrlHandler-Integrated-4.0" /> 
    <!-- <remove name="OPTIONSVerbHandler" /> --> 
    <remove name="TRACEVerbHandler" /> 
    <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" /> 
</handlers> 
0

由於IIS團隊發佈IIS CORS module不再需要像空方法一樣的黑客行爲。它適當地處理CORS包括預檢請求。你可以在Web配置中配置它,例如:

<?xml version="1.0" encoding="UTF-8"?> 
<configuration> 
    <system.webServer> 
     <cors enabled="true" failUnlistedOrigins="true"> 
      <add origin="*" /> 
      <add origin="https://*.microsoft.com" 
       allowCredentials="true" 
       maxAge="120"> 
       <allowHeaders allowAllRequestedHeaders="true"> 
        <add header="header1" /> 
        <add header="header2" /> 
       </allowHeaders> 
       <allowMethods> 
        <add method="DELETE" /> 
       </allowMethods> 
       <exposeHeaders> 
        <add header="header1" /> 
        <add header="header2" /> 
       </exposeHeaders> 
      </add> 
      <add origin="http://*" allowed="false" /> 
     </cors> 
    </system.webServer> 
</configuration> 
相關問題