如何对未处理的异常使用“问题详细信息”响应?

时间:2019-03-22 11:38:55

标签: c# exception asp.net-core asp.net-core-webapi asp.net-core-2.2

documented一样,ProblemDetails(基于RFC 7807规范)是ASP.NET Core 2.2中客户端错误代码的标准响应。当我在API控制器操作方法中返回诸如NotFound()之类的内容时,此方法就可以正常工作。

但是,如何将我的Web API项目配置为也将ProblemDetails用于未处理的异常(“ 500 Internal Server Error”响应)?默认情况下,此类未处理的异常要么返回HTML正文(调用UseDeveloperExceptionPage()UseExceptionHandler(somePath)时),要么不返回正文(如果未调用任何方法)。

当API控制器中发生异常时,我的首选解决方案始终会返回一个ProblemDetails对象,但是对于其他(与视图相关)控制器上的异常,我仍然会返回HTML页面。在开发模式下,ProblemDetails对象应具有完整的异常详细信息,而在生产中仅具有非常有限的详细信息。这可能吗?

1 个答案:

答案 0 :(得分:1)

似乎ProblemDetails不支持404500异常。一种解决方法是安装Hellang.Middleware.ProblemDetails软件包`,

Install-Package Hellang.Middleware.ProblemDetails

然后在startup.cs中进行配置,仅在开发环境下将IncludeExceptionDetails设置为ture

public class Startup
{
    public Startup(IConfiguration configuration, IHostingEnvironment env)
    {
        Configuration = configuration;
        CurrentEnvironment = env;
    }

    public IConfiguration Configuration { get; }
    public IHostingEnvironment CurrentEnvironment { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddProblemDetails(setup=> {

            setup.IncludeExceptionDetails = _ => CurrentEnvironment.IsDevelopment();
        });
        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
    }

    public void Configure(IApplicationBuilder app)
    {           
        app.UseProblemDetails();           
        //...
    }
}

请参阅here