2015-11-04 21 views
10

私はStackOverflowで多くの同様の問題を読んでいますが、解決策は私のためには機能しません。プリフライトの応答に無効なHTTPステータスコード405

私は、WCF RESTサービスがあります。

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

私はポストマン(Chromeの拡張機能)を使用して、それを使用することができます。私は 'urlencoded'ではなく 'raw'としてデータを渡しています。私は200のリターンコードを取得します。私はちょうどポストマンからURLやJSONをコピーした

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

enter image description here

私はangularjsを使用してこのメ​​ソッドを呼び出す必要があります。しかし、私はエラーを取得する:

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

私は同様の問題を検索しました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拡張は、このメソッドを正常に呼び出すことができます。

AngularJSを使用して同じPOST呼び出しを行うにはどうすればよいですか?

更新:ここ

は、OPTIONS要求である:

enter image description here

レビューとレスポンスのタブが空である

アップデート2:

すべてがIEで正常に動作します、しかし動作しませんクロム。

+0

通常、.Netは405ステータスコードとともにエラー情報を送信します。 –

+0

質問を更新し、Chromeでこのリクエストの画面を追加しました。 – demas

+0

いいえ、あなたが投稿した更新画像を見て、「プレビュー」タブを確認してください –

答えて

6

解決策を見つけたようです。私はちょうど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 

これは何もしない空の方法です。私はその理由を知らないが、すべてが働いている。

+0

これはCORが期待しているものの、OPTIONSを許可しているuriTemplateを持っていなかったweb.configにcustomHeadersが既に存在するために機能しました。したがって、emtpyメソッドを作成した後で、プリフライトが機能し、見出しのヘッダーがcustomHeadersから取得される可能性があります。 –

+0

これは、1ヶ月間、他の提案を試してみると、うまくいきませんでした。 – quilkin

+0

これはうまくいきますが、既存のメソッドを複製しないでMethod = "OPTIONS"に変更できると思います。それはまだデータを投稿します。 – masospaghetti

21

閉鎖された質問でさえ、私はどのような仕事をしたいのですか。

まず、ウェブ上でCORSを有効にする必要があります。(悲しいミハイのように)設定:

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

そして最後に、オプションを処理するために:あなたはいくつかの余分なHEADERパラメータを持っている

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

場合は、同様に、アクセス制御 - 許可 - ヘッダに追加する必要がありますあなたのアプリケーションクラスに空の応答で返信する必要があります。

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

私はASP net web apiで同じエラーが発生する4.対処方法を教えてください –

+0

いくつかのdllファイルが壊れている場合があります。サーバーが帰ってきたかどうかをテストする方法はありますか?それは、あなたがしたすべての呼び出しで、またはちょうどいくつかの場合に起こりますか? –

+1

シンプルな$ .ajaxコールは正常に動作していますが、$ http(angularjsモジュール)からのリクエストでこのエラーが発生しました。これについて質問しました:http://stackoverflow.com/questions/37629422/angularjs-with naspel-web-api-http-post-returning-xmlhttprequest-can not-load?noredirect = 1#comment62740684_37629422 –

0

これはすでに回答がありますが、私の解決策を得ています。あなたはまず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> 

を追加<remove name="OPTIONSVerbHandler" />

に指示を削除する必要がWeb構成で はその後コメントアウトまたはIISので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 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> 
関連する問題