web-dev-qa-db-ja.com

Access-Control-Allow-Originヘッダーに複数の値がありますOR jqueryajaxをWebApi2にプリフライトします

私はasp.net Webフォームアプリケーションlocalhost:6414で実行次にjquery ajaxを呼び出しますWeb Apiサービスオンlocalhost:11974

エラーが発生します

The 'Access-Control-Allow-Origin' header contains multiple values '*, *', but only one is allowed. Origin 'http://localhost:6414' is therefore not allowed access. 

だから私はgooglestackoverflowをくまなく調べて、conflictinginformationのトンを見つけます。

1. Fix with web.config   
2. Fix with jquery ajax call
3. Fix with CORS in web.api 

Corsを有効にしてweb.configおよびあらゆる種類のtechniquesを試しました。

現在、問題は実際には送信者としてのWebフォームのjqueryコードにあるのだろうかと思いますが、実際には応答ヘッダーはWebAPIサービスからのものであることを意味します...

応答ヘッダーを見ると、そのうちの2つが表示されます

Access-Control-Allow-Origin:*  ( repeated TWICE)

Web Apiプロジェクトのweb.configでこの行をコメントアウトしようとしています

<add name="Access-Control-Allow-Origin" value="*" />

その後、この401エラーが発生します:

No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:6414' is therefore not allowed access. The response had HTTP status code 401.

私はweb.configにこのコードを持っています

<authentication mode="Windows" />
<authorization>
  <allow verbs="OPTIONS" users="*" />
  <deny users="?" />
</authorization>

さて、もし私がncommentAccess-Control。 ... in web.configそしてTHEN comment out --- [〜#〜] cors [〜#〜]コードWebApiConfig。cs

var cors = new EnableCorsAttribute("*", "*", "*");
config.EnableCors(cors);

そのコードがコメントアウトされている場合、プリフライトエラーが発生します

 XMLHttpRequest cannot load http://localhost:11974/PostCheckBox. Response for preflight has invalid HTTP status code 405

これは完全に狂気のようです。

Jqueryコード

function sendCheckboxes(id, out, yes, no) {
            //$(function () {
            //var storm = { id: 1902, StormOut: 1, StormYes: 1, StormNo: 1 };
            var storm = { id: id, StormOut: out, StormYes: yes, StormNo: no };
            //jQuery.support.cors = true;
            $.ajax({
                type: "POST",
                data: JSON.stringify(storm),
                url: "http://localhost:11974/PostCheckBox",
                contentType: "application/json",
                //crossDomain: true,
                success: function (data) {
                    console.log(data)
                },
                error: function (x, y, z) {
                    console.log(x + '\n' + y + '\n' + z);
                }
            });

            //});
        }

WebAPIメソッド

[Route("PostCheckBox")]
public HttpResponseMessage PostCheckBox([FromBody] StormData storm) 
    {.... }

このメソッドを同じドメイン(今のところローカルホストの同じポート)から呼び出すと、正常に機能します

http://localhost:11974/checkbox.html

何が...

7
Brian Thornton

あなたはあなたのweb.configと戦っています

Web.configに追加したすべてのがらくたをコメントアウトしてください!

 <authentication mode="Windows" />
    <authorization>
      <allow verbs="OPTIONS" users="*" />
      <deny users="?" />
 </authorization>

私はそれを使用しません、そして私はそれが1つの問題であることを確信していますまた別のものはあなたがする必要があるということですコメントアウト

<add name="Access-Control-Allow-Origin" value="*" />

次にDO USEこれらの行

var cors = new EnableCorsAttribute("*", "*", "*");
config.EnableCors(cors);

いつでもセキュリティ、認証、承認を追加して、Cors固有のリクエストをグローバルではなく、クラスまたはメソッドで行うことができますが、物事を機能させるだけで苦労している場合は、これは確かに機能するはずです。

12
Tom Stickel

Startup.csでcorsを有効にする

    public void Configuration(IAppBuilder app)
    {
        HttpConfiguration config = new HttpConfiguration();

        app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
        ConfigureOAuth(app);

        WebApiConfig.Register(config);

        // Make sure this line is called before ConfigureAuth(app), 
        // app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);

        app.UseWebApi(config);
    }
0
dichen