Политика .NET 6 CORS заблокирована на стороне клиента CORS
Клиентская часть моего приложения — .NET6, а веб-API на стороне сервера — .NET 4.8. При попытке доступа к серверу в консоли браузера возникает следующая ошибка:
Доступ к выборке на «https://localhost:12345/api/controller/method» из источника «https://localhost:34564» заблокирован политикой CORS: отсутствует заголовок «Access-Control-Allow-Origin». на запрашиваемом ресурсе. Если непрозрачный ответ соответствует вашим потребностям, установите для режима запроса значение «no-cors», чтобы получить ресурс с отключенным CORS.
В моем startup.cs у меня есть следующий код:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Latest);
// In production, the React files will be served from this directory
services.AddSpaStaticFiles(configuration =>
{
configuration.RootPath = "ClientApp/build";
});
services.AddCors(options =>
{
options.AddPolicy("AllowSpecificOrigin",
builder => builder.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader()
);
});
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseHsts();
}
app.UseCors("AllowSpecificOrigin");
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseSpaStaticFiles();
app.UseRouting();
app.UseSpa(spa =>
{
spa.Options.SourcePath = "ClientApp";
if (env.IsDevelopment())
{
spa.UseReactDevelopmentServer(npmScript: "start");
}
});
}
Настройка CORS в файле WebAPIConfig.cs
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API configuration and services
var cors = new EnableCorsAttribute("*", "*", "*");
config.EnableCors(cors);
config.Filters.Add(new AuthorizationAttribute());
config.MapHttpAttributeRoutes();
// Web API routes
GlobalConfiguration.Configuration.Formatters.Add(new FormMultipartEncodedMediaTypeFormatter());
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}/{other}",
defaults: new { id = RouteParameter.Optional, other = RouteParameter.Optional }
);
}
}
2 ответа
Я не уверен, почему «AllowAnyOrigin()» не работает, но мне удалось обойти проблему с помощью этого кода:
// global cors policy
app.UseCors(x => x
.AllowAnyMethod()
.AllowAnyHeader()
.SetIsOriginAllowed(origin => true) // allow any origin
.AllowCredentials());
И, конечно же, это должно быть в коде вашего проекта API, а не во внешнем коде.
Для того, чтобы решить вашу
CORS
проблема, вы можете сделать следующее в файле web.config:
Под
<system.webServer>
раздел, поместите следующее, чтобы включить CORS глобально в вашем проекте:
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Credentials" value="true"/>
<add name="Access-Control-Allow-Headers" value="Content-Type" />
<add name="Access-Control-Allow-Methods" value="GET, POST, PUT, OPTIONS" />
</customHeaders>
</httpProtocol>