【问题标题】:webapi: set message in global exception handlerwebapi:在全局异常处理程序中设置消息
【发布时间】:2017-10-04 10:24:24
【问题描述】:

在我的 webapi 项目中,我有一个全局异常处理程序,我想在未捕获异常时设置状态代码 500,并且我想设置自定义消息,但我不知道如何设置该消息。这是我的代码:

public class MyExceptionHandler : IExceptionHandler
{
    public Task HandleAsync(ExceptionHandlerContext context, CancellationToken cancellationToken)
    {
        context.Result = new StatusCodeResult(HttpStatusCode.InternalServerError, context.Request);

        return Task.FromResult<object>(null);
    }
}

配置如下:

        config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.LocalOnly;

        config.Services.Replace(typeof(IExceptionHandler), new MyExceptionHandler());

在邮递员中,响应正文为空,我只看到 500 错误代码。那么这里如何设置消息呢?

【问题讨论】:

标签: c# asp.net-web-api exception-handling


【解决方案1】:

这是一个例子:

public class ExceptionFilter : ExceptionFilterAttribute
{
    private TelemetryClient TelemetryClient { get; }

    public ExceptionFilter(TelemetryClient telemetryClient)
    {
        TelemetryClient = telemetryClient;
    }

    public override void OnException(ExceptionContext context)
    {
        context.ExceptionHandled = true;
        context.HttpContext.Response.Clear();
        context.HttpContext.Response.StatusCode = (int) HttpStatusCode.InternalServerError;
        context.Result = new JsonResult(new
        {
            error = context.Exception.Message
        });

        TelemetryClient.TrackException(context.Exception);
    }
}

您可以在启动时使用它 - ConfigureService:

services.AddSingleton<ExceptionFilter>();
services.AddMvc(
                options => { options.Filters.Add(services.BuildServiceProvider().GetService<ExceptionFilter>()); });

它现在还将向 azure 遥测发送异常。

您当然可以删除遥测客户端和方法:)

干杯!

【讨论】:

  • 使用这个解决方案,如果我有 10 个控制器,每个控制器都有自己的异常类型,我需要添加 10 个过滤器......所以使用异常处理程序类是不可能的?
  • @BudaGavril,你为什么需要那个? context.Exception 包含每个控制器可能抛出的异常..
  • 查看我上面的评论...这样当我添加新的控制器和异常类型时,此异常由我的异常处理程序处理,而无需添加新过滤器或编辑现有过滤器
  • 也许我错过了你的意思,但是使用这个解决方案,你不需要在每次添加新控制器时都添加新过滤器......你能澄清一下吗?
  • 如果我要添加一个新的控制器,我会为 mew 控制器添加一个新的异常类型,如果我有一个新的异常类型,我需要一个新的过滤器,除非我有一个基本异常,该异常的过滤器,我为每个控制器派生一个新异常...
猜你喜欢
  • 2015-12-21
  • 2013-07-01
  • 2011-04-07
  • 2014-04-17
  • 2012-12-31
  • 2011-05-19
  • 2011-08-31
  • 2010-12-05
  • 1970-01-01
相关资源
最近更新 更多