#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:
- Установите пакет CORS nuget.
Install-Package Microsoft.AspNetCore.Cors
-
Добавьте службы CORS в ConfigureServices
public void ConfigureServices(IServiceCollection services) { services.AddCors(); }
-
В файле 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. подождите, вкладка ответа ничего не содержит .., и заголовка ответа вообще нет, только заголовок запроса