web-dev-qa-db-ja.com

プリフライトの応答に無効なHTTPステータスコード405が含まれています

StackOverflowで似たような問題を数多く読んだことがありますが、解決策はありません。

WCF RESTサービス:

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

Postman(Chrome拡張)を使用して使用できます。 「urlencoded」ではなく「raw」としてデータを渡します。そして、200の戻りコードを受け取ります。

enter image description here

Angularjsを使用してこのメ​​ソッドを呼び出す必要があります:

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

PostmanからURLとJSONをコピーしました。しかし、私はエラーを受け取ります:

angular.js:10722 OPTIONS http://192.168.1.65/Service1.svc/restapi/PostItemhttp://192.168.1.65/Service1.svc/restapi/PostItem 。プリフライトの応答に無効なHTTPステータスコード405が含まれています

同様の問題を検索し、2つの解決策を見つけました。

  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>
    

それは私を助けません。そして、サーバー側のエラーの理由がわからない。 Postman拡張機能は、このメソッドを正常に呼び出すことができます。

同じPOST AngularJSを使用して呼び出しますか?

更新

OPTIONSリクエストは次のとおりです。

enter image description here

[レビュー]タブと[応答]タブは空です

更新2:

IEではすべて正常に動作しますが、Chromeでは動作しません。

10
demas

私は解決策を見つけたようです。 2番目のメソッドを追加しました。

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

何もしないのは単なる空のメソッドです。理由はわかりませんが、すべて機能しています。

7
demas

閉ざされた質問でさえ、私は自分にとって何が効果的かを示したい。

まず、web.configでCORSを有効にする必要があります(Mihai sadなど):

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

追加のHEADERパラメーターがある場合は、次のようにAccess-Control-Allow-Headersに追加する必要があります。

<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();
    }
}
24
Tiago Gouvêa

これにはすでに答えがありますが、私の解決策はここにあります。ウェブ設定では、<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>
2
Morvael

私のために働いたソリューション:

  1. これを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>
    
  2. Global.asaxファイル(グローバルアプリケーションクラス)を作成し、次のコードを追加します。

        protected void Application_BeginRequest(object sender, EventArgs e){
            if (Request.Headers.AllKeys.Contains("Origin") && Request.HttpMethod == "OPTIONS")
                {
                    Response.Flush();
                }
        }
    
0
Tech Enthusiast

IIS Team published 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>
0
Jesús López

私はAJAXリクエストでxhr.setRequestHeader()を削除することで同じ問題を解決しました。誰かがコードにある場合は、それを削除してみてください。

0
muinh