【发布时间】:2018-10-24 12:53:12
【问题描述】:
我有 CORS 并且正在工作。这意味着我在 GET 或 POST 上没有收到 CORS 错误。我的请求都在服务器上收到,他们的响应都在客户端收到。
也就是说,除非 Web API 中出现异常。然后,我没有得到异常详细信息,而是得到了 CORS 错误。所以客户端看不到异常详情。
加载失败 http://localhost:64630/api/sql/familiesCollection/create:没有 'Access-Control-Allow-Origin' 标头出现在请求的 资源。因此不允许使用原点“http://localhost:4200” 使用权。响应的 HTTP 状态代码为 500。
这是我的 Startup 类中的 Configure 方法:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseCors(builder => builder
.AllowAnyHeader()
.AllowAnyOrigin()
.AllowAnyMethod());
app.UseMvc();
}
如果接受了 CORS 请求,并且接受了返回的 CORS 响应,为什么客户端不接受错误事件中的异常详细信息?
更新...根据 Marcus 的建议,我实现了一个更详细的版本;但无济于事。当 Web API 中发生未处理的异常时,尝试在 500 响应中返回错误数据的一种情况下仍然会出现相同的 CORS 错误。
public void ConfigureServices(IServiceCollection services)
{
services.AddCors(o => o.AddPolicy("AllowAllPolicy", builder =>
{
builder.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader();
}));
services.AddMvc();
services.AddOptions();
services.Configure<AppConfig>(Configuration.GetSection("AppConfig"));
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseCors("AllowAllPolicy");
app.UseMvc();
}
然后,在我的控制器类中:
[EnableCors("AllowAllPolicy")]
public class SqlApiController
{
:
这些都没有帮助。 CORS 一直有效,直到 Web API 出现异常。然后,我得到了这个,而不是来自 500 的异常信息:
加载失败 http://localhost:64630/api/sql/familiesCollection/create:没有 'Access-Control-Allow-Origin' 标头出现在请求的 资源。因此不允许使用原点“http://localhost:4200” 使用权。响应的 HTTP 状态代码为 500。
【问题讨论】:
-
只是好奇,为什么两个 URL 的端口不同?
-
端口 64630 是 Web API,在端口 4200 上从客户端调用。这就是使其成为 CORS 调用的原因。问题是我有适用于所有请求和响应的 CORS 支持。当 Web API 端出现异常时,我只会收到 CORS 错误。然后,我希望将异常详细信息返回到客户端,而不是这个 CORS 错误。
-
Web API 如何抛出错误/错误如何处理?是否有一些全局处理程序,例如过滤?
-
这是设计使然。请参阅此处了解更多信息:github.com/aspnet/Home/issues/2378
-
您需要显式调用
app.UseExceptionHandler(...)。更多信息here.
标签: asp.net-web-api