在从 Angular 6 调用 ASP.NET Core Web API 的服务器异常上获取 CORS 错误 *only*
Posted
技术标签:
【中文标题】在从 Angular 6 调用 ASP.NET Core Web API 的服务器异常上获取 CORS 错误 *only*【英文标题】:Getting CORS error *only* on server exception calling ASP.NET Core Web API from Angular 6 【发布时间】: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.
【参考方案1】:
据我所知,您对 CORS 配置没有任何特定限制,并且您允许“全部”。在这种情况下,这可能会对您有所帮助。
我还看到你用 [EnableCors...] 属性装饰你的控制器,所以如果出现错误,它可能会退出当前控制器并且错误在“其他地方”处理,这可能会导致属性超出范围...
我使用了一种更简单的方法,但允许 CORS 并且错误也“传输”到客户端。
using Microsoft.Owin.Cors;
namespace Test
public partial class Startup
public void ConfigureAuth(IAppBuilder app)
app.UseCors(CorsOptions.AllowAll);
然后删除与 CORS 相关的所有其他内容,这对于全局启用的 CORS 就足够了,并且允许所有来源(即 *)。
【讨论】:
以上是关于在从 Angular 6 调用 ASP.NET Core Web API 的服务器异常上获取 CORS 错误 *only*的主要内容,如果未能解决你的问题,请参考以下文章
使集成的安全性和 CORS 与 Asp.Net、Angular 6 和 IIS 一起工作
为啥我的 IIS7 应用程序池在从 ASP.NET 页面调用的 DLL 中出现异常后关闭?
ASP.NET MVC RedirectToAction 在从视图中发布 AJAX 后不起作用
ASP.NET Core 中的 Angular 应用 6:多个模块匹配