仅在从Angular 6

时间:2018-05-14 19:13:53

标签: asp.net-web-api cors

我有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。

1 个答案:

答案 0 :(得分:0)

根据我的看法,您对CORS配置没有任何特定限制,并允许“全部”。在这种情况下,这可以帮助你。

我也看到你用[EnableCors ...]属性装饰你的控制器,所以在出错时它可能会从当前控制器中移出并且错误在“其他地方”被处理,这可能导致该属性超出范围...

我使用了更简单的方法,但允许CORS,错误也被“传输”到客户端。

using Microsoft.Owin.Cors;

namespace Test
{
    public partial class Startup
    {

        public void ConfigureAuth(IAppBuilder app)
        {
            app.UseCors(CorsOptions.AllowAll);

然后删除与CORS相关的所有其他内容,这足以支持全局启用的CORS并允许所有来源(即*)。