Заголовок ‘Access-Control-Allow-Origin’ отсутствует. XMLHttpRequest

#javascript #asp.net-core #cors #xmlhttprequest

#javascript #asp.net-core #cors #xmlhttprequest

Вопрос:

Я получил объект XMLHttpRequest, и я пытаюсь отправить длинную строку html-данных в Asp Net Core, чтобы сделать из нее PDF-файл содержимого. Но все еще получаю политики CORS. Несмотря на то, что в моем заголовке есть «Access-Control-Allow-Origin», для меня это все еще проблема. Уже перепробовал все с CORS. Установлен cors для Asp net Core, ничего не изменилось. Все работает нормально, если я использую свой HTML-документ из локального.

Полная ошибка:

Доступ к XMLHttpRequest в ‘https://…/getInfoWindowPdf ?’ из источника ‘https://…’ заблокирован политикой CORS: Ответ на предполетный запрос не проходит проверку контроля доступа: заголовок ‘Access-Control-Allow-Origin’ отсутствует на запрошенном ресурсе.

 function infoWindowPdf()
{
    // Create request
    let http = new XMLHttpRequest(); //XMLHttpRequest XDomainRequest
    let url = backend   "getInfoWindowPdf?";

    // Add in htmlContent header
    let htmlContent = "<style>"   style  "</style>";

    // Get needed content
    let infoWindow = document.querySelector("#section-library-modal");

    //Waits for backend to create file after all open it and remove created temporary files
    http.onreadystatechange = function()
    {
        if(http.readyState == 4)
        {
            window.open(backend   'InfoPdf?filePath=C:\Projects\Web\WebSections\wkhtmltopdf\bin\pdf-export\'   sectionName   ".pdf", '_blank');
            setTimeout(() => {getDBData('removepdf?filePath=C:\Projects\Web\WebSections\wkhtmltopdf\bin\pdf-export\amp;filename='   sectionName);}, 100);
        }
    };

    http.open("POST", url, true);
    http.setRequestHeader('Access-Control-Allow-Origin', '*');
    http.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); //application/x-www-form-urlencoded
    http.send(params);
}
  

Моя конфигурация запуска ядра Asp Net для CORS.

 readonly string MyAllowSpecificOrigins = "_myAllowSpecificOrigins";

  public void ConfigureServices(IServiceCollection services)
    {
        services.AddCors(options =>
        {
            options.AddPolicy(MyAllowSpecificOrigins,
            builder =>
            {
                builder.WithOrigins("http://localhost:5000",
                                    "http://localhost:5000/websections/getInfoWindowPdf?"
                                    ).AllowAnyHeader().AllowAnyMethod();
            });
        });

        services.Configure<CookiePolicyOptions>(options =>
        {
            // This lambda determines whether user consent for non-essential cookies is needed for a given request.
            options.CheckConsentNeeded = context => true;
            options.MinimumSameSitePolicy = SameSiteMode.None;
        });

        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
    }

 public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
            app.UseHsts();
        }

        app.UseCors(MyAllowSpecificOrigins);

        //app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseCookiePolicy();

        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
        });
    }
  

Редактировать:
Даже не пытайтесь работать с Xmlhttprequest, если вы хотите отправить некоторые данные в свой серверный проект. Просто используйте серверную часть напрямую.

Комментарии:

1. У меня была такая же проблема несколько дней назад. Оказывается, это не проблема CORS; но именно так она и решается. В моем случае я не запускал asp.net основной проект (да, я иногда бываю таким тупым).

2. Не думайте, что это что-то другое, чем CORS. Моя кнопка работает, если я открываю HTML-файл с локального. Но возникает эта ошибка, если открыть тот же HTML из Asp.

3. Какова ваша политика CORS в приложении .net core? У вас должно быть что-то в startup.cs и / или расширение, которое задает вашу политику. В вашем запросе не должно быть ничего, что не требуется.

4. отредактировал мой пост.

5. Ваше сообщение об ошибке, несмотря на выполненное вами усечение, показывает, что ваш origin начинается с https:// но все разрешенные вами origins начинаются с http:// . Похоже, вы только что допустили опечатку в своем списке приемлемых источников.

Ответ №1:

  1. Установите пакет CORS nuget.
     Install-Package Microsoft.AspNetCore.Cors  
  2. Добавьте службы CORS в ConfigureServices

     public void ConfigureServices(IServiceCollection services)
    {
      services.AddCors();
    }
      
  3. В файле Configure метод запуска.cs

     public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    {
        app.UseCors(
            options => options.WithOrigins("http://example.com").AllowAnyMethod()
        );
        app.UseMvc();
    }  

Комментарии:

1. пробовал ваш точный вариант, даже я пробовал его раньше, все еще получая ту же ошибку.

2. если вы используете chrome, можете ли вы увидеть, какие заголовки запроса / ответа присутствуют на вкладке сеть после отправки запроса?

3. подождите, вкладка ответа ничего не содержит .., и заголовка ответа вообще нет, только заголовок запроса