【发布时间】:2019-02-11 17:22:21
【问题描述】:
我创建了一个带有单个控制器的 ASP.Net CORE Web API 项目,现在想从客户端 (React) Web 应用程序调用它。
但是,调用失败并显示“请求的资源上不存在 'Access-Control-Allow-Origin' 标头。”。
从 Fiddler 调用同一端点时,预期的响应标头不存在。
感谢 ATerry,我有进一步的见解:标头不存在,因为 React Web 应用程序和 .Net Core Web API 托管在同一个盒子上。 React 填充与(API)框相同的请求 Origin: 标头,因此服务器(非常聪明)不会添加 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/posts/2016/Sep/26/ASPNET-Core-and-CORS-Gotchas
How to enable CORS in 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
【问题讨论】:
-
您是否将请求中的
origin标头设置为您当前域以外的其他内容?如果不是跨域请求,API 足够智能,可以排除标头。 -
很好的观察,谢谢。在测试中,我在服务器盒子上发起了来自 Fiddler 的请求。添加请求标头“origin:somethingelse”时,响应确实具有预期的标头。我刚刚从同一个子网中的另一个盒子测试它,结果相同:在没有原始请求标头的情况下调用时,Access-Control-Allow-... 响应标头丢失,当我添加请求标头时它们是正确的返回。
-
CORS是双向确认,Client需要请求CORS,Server需要接受
-
@Richard Hubley 你能给我一个关于如何做到这一点的指针吗?我发现了许多与其他服务器类型类似的案例(比如这个节点 js 服务器仅描述了我的问题:elegantcode.com/2018/06/10/…),但它们都提到了服务器端解决方案:服务器必须提供适当的响应标头。与客户无关。
-
@balintn 作为客户端,您使用什么?看起来你已经通过添加标题解决了邮递员的问题。您仍然对哪个客户有问题?
标签: asp.net reactjs .net-core cors