Заголовок Access-Control-Allow-Origin имеет несколько значений или Preflight jQuery ajax для веб-Api 2

у меня есть asp.net веб-формы приложение работает на localhost:6414 затем jQuery ajax вызывает служба веб-Api on 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 и Т конфликта информация.

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

Я пробовал Cors включена и web.config и всякие методы.

в настоящее время мне интересно, является ли проблема на самом деле кодом jQuery веб-форм в качестве отправителя, но на самом деле заголовки ответов означают, что это от службы Web api...

я смотрю на мои заголовки ответов, и я вижу 2 из эти

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

я пытаюсь прокомментировать эту строку в интернете.config в проекте Web Api

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

теперь, если я раскомментировать the Доступ-Контроля.... в web.config а то комментарий на 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);
                }
            });

            //});
        }

метод веб-api

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

если я вызываю этот метод из того же домена (на данный момент тот же порт на localhost), он отлично работает

http://localhost:11974/checkbox.html

что дает...

2 ответов


вы боретесь свой web.config

прокомментируйте все дерьмо, которое вы добавили в интернет.конфиг!

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

Я не использую это, и я уверен, что это 1 выпуск Также другое, что вам нужно комментарий

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

а то ИСПОЛЬЗУЙТЕ эти строки

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

вы всегда можете добавить в безопасность, аутентификацию и авторизацию и иметь запрос специфики Cors не глобальный, а на класс или Метод, но если вам трудно просто заставить вещь работать, то это действительно должно работать.


включить cors при запуске.cs

    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);
    }