在从 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:多个模块匹配

将基于 Angular 6 的网页与旧版 ASP.NET 门户网站合并

收到错误“JSONP 注入脚本未调用回调。”使用 Angular 2 和服务器 ASP.NET 核心