Я создал проект веб-API ASP.Net CORE с одним контроллером и теперь хотел бы вызвать его из клиентского (React) веб-приложения.
Однако вызов завершается неудачно, так как в запрошенном ресурсе отсутствует заголовок «Access-Control-Allow-Origin». "
При вызове той же конечной точки из Fiddler ожидаемые заголовки ответа отсутствуют.
Благодаря ATerry у меня появилось еще одно понимание: заголовки отсутствуют, поскольку веб-приложение React и веб-API .Net Core размещены в одном блоке. React заполняет запрос Origin: заголовок, который совпадает с полем (API), таким образом, сервер (действительно умный в этом вопросе) не добавляет заголовки ответа Allow -... Однако приложение React отклоняет ответ из-за отсутствия этих заголовков.
Я использую .Net Core v2.1 (последняя на момент написания статьи).
Я построил код на основе
https://docs.microsoft.com/en-us/aspnet/core/security/cors?view=aspnetcore-2.1
Я проверил это
https://weblog.west -wind.com / сообщений / 2016 / Сентябрь / 26 / ASPNET-Core-и-CORS-Gotchas
CORS в .NET Core
Как включить CORS в ASP.NET Core
... но ни одно из предложений не сработало.
Есть идеи?
Вот как я настраиваю приложение .Net Core (код изменен с фактического, чтобы попытаться разрешить что-либо):
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
// Enable CORS (Cross Origin Requests) so that the React app on a different URL can access it
// See https://docs.microsoft.com/en-us/aspnet/core/security/cors?view=aspnetcore-2.1
services.AddCors(options =>
{
options.AddPolicy(Global.CORS_ALLOW_ALL_POLICY_NAME, builder => builder
.AllowAnyOrigin()
.AllowAnyHeader()
.AllowAnyMethod()
.AllowCredentials());
});
services.AddMvc();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseHsts();
}
app.UseCors(Global.CORS_ALLOW_ALL_POLICY_NAME);
app.UseHttpsRedirection();
app.UseMvc();
}
}
Не справившись с вышеперечисленным, я добавил атрибуты CORS в класс контроллера и методы контроллера:
[Route("api/[controller]")]
[ApiController]
[EnableCors(Global.CORS_ALLOW_ALL_POLICY_NAME)]
public class DealsController : ControllerBase
{
[...]
[HttpGet]
[EnableCors(Global.CORS_ALLOW_ALL_POLICY_NAME)]
public ActionResult<List<Deal>> GetAll()
{
return Store;
}
}
Заголовки ответа, которые я получаю:
HTTP/1.1 200 OK
Transfer-Encoding: chunked
Content-Type: application/json; charset=utf-8
Server: Kestrel
X-Powered-By: ASP.NET
Date: Thu, 06 Sep 2018 12:23:27 GMT
Отсутствуют заголовки:
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: http://localhost:3000