繁体   English   中英

ASP.Net Core 2 错误处理:如何在 Http 响应中返回格式化的异常详细信息?

[英]ASP.Net Core 2 error handling: How to return formatted exception details in Http Response?

我正在寻找一种方法来返回调用我的 Web API 的方法时发生的任何异常的详细信息。

默认情况下,在生产环境中,错误 500“内部服务器错误”是 API 返回的唯一信息。

它是一个不通过 Internet 发布的私有 API,调用方应用程序需要获取和存储所有详细信息,以防万一。

异常详细信息可以是HttpResponse内容中的JSON格式,允许调用者读取Message属性和异常的StackTraceString属性(没有像UseDeveloperExceptionPage配置的 HTTP 页面)。

目前默认的启动配置方法是:

public class Startup
{   
    [...]

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory)
    {
        loggerFactory.AddNLog();
        env.ConfigureNLog(Path.Combine(AppContext.BaseDirectory, "nlog.config"));

        if ( env.IsDevelopment() )
            app.UseDeveloperExceptionPage();
        else
            app.UseStatusCodePages();

        app.UseMvc();
    }
}

您可以编写一个自定义中间件,它拦截所有异常并将它们返回给调用者:

public class ExceptionHandler
{
    private readonly RequestDelegate _next;

    public ExceptionHandler(RequestDelegate next)
    {
        _next = next;
    }

    public async Task Invoke(HttpContext context)
    {
        try
        {
            await _next.Invoke(context);
        }
        catch (Exception ex)
        {
            await HandleExceptionAsync(context, ex);
        }
    }

    private async Task HandleExceptionAsync(HttpContext context, Exception exception)
    {
        var response = context.Response;
        response.ContentType = "application/json";
        response.StatusCode = (int)HttpStatusCode.InternalServerError;
        await response.WriteAsync(JsonConvert.SerializeObject(new
        {
            // customize as you need
            error = new
            {
                message = exception.Message,
                exception = exception.GetType().Name
            }
        }));
    }
}

并在您的启动配置方法中注册它:

if (env.IsDevelopment())
    app.UseDeveloperExceptionPage();
else
   app.UseMiddleware<ExceptionHandler>();

作为中间件的替代方案,您可以创建 ActionFilterAttribute 并更改 IActionResult

这是一个简单的示例属性,对于所有未处理的异常,使用 Exception 方法返回 400 Bad request。

public class MyUnhandledExceptionFilter : ActionFilterAttribute, IExceptionFilter
{        
    public void OnException(ExceptionContext context)
    {           
        context.Result = new BadRequestObjectResult(context.Exception.Message);
    }
}

然后您在启动的 ConfigureServices 方法中注册它,如下所示

services.AddMvc(options =>
        {
            options.Filters.Add(typeof(MyUnhandledExceptionFilter));
        })

这只会捕获到达 MVC 的异常,这在大多数情况下是您需要的

请记住在 UseMvc(或 .Net Core 3 中的 UseRouting)之前添加它,因为顺序很重要!!!!!!

        app.UseRouting ();
        app.UseMiddleware (typeof (ErrorHandlingMiddleware));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM