私は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.
だから私はgoogleとstackoverflowをくまなく調べて、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
何が...
あなたはあなたの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固有のリクエストをグローバルではなく、クラスまたはメソッドで行うことができますが、物事を機能させるだけで苦労している場合は、これは確かに機能するはずです。
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);
}