Я создал веб-страницу, которая извлекает данные из моего веб-API .NET Core, созданного на C#, с использованием .NET Framework 8.0. Моя веб-страница и API размещены на одном сервере, только на разных портах. Когда я пытаюсь вызвать API, консоль выдает следующую ошибку:
Доступ к выборке по «адресу API» из исходного «адреса веб-страницы» заблокирован политикой CORS: в запрошенном ресурсе отсутствует заголовок «Access-Control-Allow-Origin».
Одним из первых шагов, которые я предпринял для решения своей проблемы, был поиск документации Microsoft по Включению перекрестных запросов в ASP.NET Core. Я прокрутил до раздела CORS с политикой и промежуточным программным обеспечением по умолчанию и изменил код в Program.cs следующим образом:
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
builder.Services.AddCors(options =>
{
options.AddDefaultPolicy(policy =>
{
policy.WithOrigins("Webpage Address", "API Address")
.AllowAnyMethod()
.AllowAnyHeader();
});
});
var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseCors();
app.UseAuthorization();
app.MapControllers();
app.Run();
В этом коде я все еще получал ошибку CORS, поэтому попробовал внести следующие изменения, которые все равно привели к ошибке:
builder.Services.AddCors(options =>
{
options.AddDefaultPolicy(policy =>
{
policy.AllowAnyOrigins()
.AllowAnyMethod()
.AllowAnyHeader();
});
});
Я также попытался настроить свой код в соответствии с CORS с разделом именованной политики и промежуточного программного обеспечения, но с теми же результатами, которые описаны выше. Может ли кто-нибудь помочь?
Проверьте, соответствует ли ваш http или https фактическому URL-адресу. Между тем, используйте политику с именем политики, как говорят другие, как и в моем реальном проекте, без имени она потерпит неудачу.
Не могли бы вы попробовать добавить это в свой Program.cs:
builder.Services.AddCors(options => options.AddPolicy(
"AllowAll",
p => p.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader()));
// ... more code
app.UseCors("AllowAll");
app.UseCors(cors => cors.AllowAnyOrigin().AllowAnyHeader().AllowAnyMethod());
Вам следует быть осторожными с этими методами, поскольку они разрешают каждый входящий запрос. Если у вас есть конкретная машина, разрешите только эту машину и т. д. Посмотрите, работает ли это, и дайте нам знать!
Я попробую, но не представляет ли метод AllowAnyOrigin() довольно большую угрозу безопасности?
Да, это действительно так. Очень странное поведение. Вы указали здесь правильный URL-адрес, включая порт policy.WithOrigins("Webpage Address", "API Address")
? Убедитесь, что это правильно!
Я внес предложенные вами изменения, но это не решило мою проблему. Я даже дважды проверил свои URL-адреса, чтобы убедиться, что они верны, но проблема все равно возникла.
Измените свой код, как в примере, и он будет работать.
Программа.cs
...
builder.Services.AddCors(options =>
options.AddPolicy("CorsPolicy", builder =>
{
builder.AllowAnyMethod()
.SetIsOriginAllowed(_ => true)
.AllowAnyHeader()
.AllowCredentials();
}));
...
app.UseCors("CorsPolicy");
...
И получение должно включать учетные данные.
fetch('https://YourAPIAddress', {
credentials: 'include'
})
Я только что проверил сервер, на котором установлен API, и на нем не установлена ASP.NET Core Runtime 8, что наводит меня на мысль, что именно это и является причиной моей проблемы. Когда я пытаюсь перейти к URL-адресу API, вместо этого я получаю ошибку со статусом 500.
Обычно отсутствие среды выполнения не приводит к проблеме CORS, в настоящее время вы можете установить среду выполнения 8 для проверки. Выполните отладку проекта, и если API доступен, ошибка 500 возникает из других частей. Вам необходимо проверить журнал, чтобы получить более подробную информацию.
Мне удалось решить проблему. На сервере, на котором был установлен мой API, не был установлен последний пакет хостинга ASP.NET Core Runtime 8.
Проблема, с которой я столкнулся, заключалась в том, что на сервере, который я использовал для размещения моего API, не был установлен пакет хостинга .NET.
После установки я настроил свою политику CORS, чтобы разрешить один конкретный источник, и все заработало как задумано.
Не могли бы вы поставить
app.UseRouting();
перед добавлением корса.