4

IIS7.5 でホストされている WCF サービス エンドポイントに対して CORS 呼び出しを実行しようとしています。

IIS でカスタム ヘッダーを構成しました。私の設定は以下のようになります

<customHeaders>
            <add name="Access-Control-Allow-Methods" value="GET,PUT,POST,DELETE,OPTIONS" />
            <add name="Access-Control-Allow-Headers" value="x-user-session,origin, content-type, accept" />
            <add name="Access-Control-Allow-Credentials" value="true" />
        </customHeaders>

POST リクエストを実行すると、「リクエスト ヘッダー フィールド x-user-session は Access-Control-Allow-Headers によって許可されていません」というエラー メッセージが表示されます。

呼び出しからカスタム ヘッダーを削除して実行すると、すべて正常に動作します。

また、カスタム ヘッダーを使用して GET 呼び出しを行うと、API も正しく動作します。

$.ajax({
   type:"POST",
   success: function(d) { console.log(d) },
   timeout: 9000,
   url: "http://api.myserver.com/Services/v2/CreditCard.svc/update_cc_detail",
   data: JSON.stringify({"card_id":    1234,"expire_month":"11","expire_year":"2020","full_name":"Demo Account", "number":"4111111111111111","is_primary":true}),
   xhrFields: { withCredentials: true}, 
  headers: { x-user-session':  "B23680D0B8CB5AFED9F624271F1DFAE5052085755AEDDEFDA3834EF16115BCDDC6319BD79FDCCB1E199BB6CC4D0C6FBC9F30242A723BA9C0DFB8BCA3F31F4C7302B1A37EE0A20C42E8AFD45FAB85282FCB62C0B4EC62329BD8573FEBAEBC6E8269FFBF57C7D57E6EF880E396F266E7AD841797792619AD3F1C27A5AE" },
crossDomain: true,
   contentType: 'application/json'
});

アップデート

以下は、FireBug ログへのリンクです https://gist.github.com/anonymous/7333130

4

3 に答える 3

4

最も可能性の高い問題は、OPTIONSリクエストがエラー (404 または 405) を返していることです。GETこれにより、適切に機能する理由(常にプリフライト要求が必要であるとは限らない) とPOSTそうでない (常にプリフライト要求が必要になる) 理由が説明されます。

通常、IIS でホストされている WCF サービスの最も簡単な解決策は、次の方法ですべてのメソッドを有効にすることWebInvokeAttributeです。

[WebInvoke(Medthod="*")]
...

場合によっては、IIS がOPTIONデフォルトでリクエストをブロックしていることがありますOPTIONSVerbHandler。このハンドラーは、web.config から削除できます。

<handlers>
    <remove name="OPTIONSVerbHandler"/>
</handlers>

最悪のシナリオ ( OPTIONSIIS によってブロックされていないが、WCF によって処理できない場合) では、独自のハンドラーを設定できます。このようなシナリオでは、最初に以下のような単純なクラスをアセンブリに作成する必要があります。

namespace CustomHandlers
{
    public class CORSOPTIONSVerbHandler : IHttpHandler
    {
        public bool IsReusable
        {
            get { return true; }
        }

        public void ProcessRequest(HttpContext context)
        {
            if (context.Response.HttpMethod == "OPTIONS")
                context.Response.StatusCode = 200;
            else
                context.Response.StatusCode = 405;

            context.Response.End();
        }
    }
}

新しいハンドラーは、次のように web.config に追加できます。

<handlers>
    <remove name="OPTIONSVerbHandler"/>
    <add name="CORSOPTIONSVerbHandler" verb="OPTIONS" path="*" type="CustomHandlers.CORSOPTIONSVerbHandler, CustomHandlers"/>
</handlers>

もちろん、アセンブリ、名前空間、およびクラス名を適切に調整する必要があります。

于 2013-11-04T15:51:10.287 に答える
0

これらを web.config に追加してみてください

<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Headers" value="Origin, X-Requested-With, Content-Type, Accept" />

通常、クロスオリジンリクエストが原因で発生します

于 2013-11-04T14:17:18.073 に答える