【问题标题】:ASP.NET WEB API 2: Exception Handler and Logger not handling all errorsASP.NET WEB API 2:异常处理程序和记录器未处理所有错误
【发布时间】:2016-09-23 16:50:37
【问题描述】:

我需要一种方法来在一个地方处理和记录 web api 中发生的所有异常。 我重写了 ExceptionLogger 和 ExceptionHandler 的方法,但是代码中断并且从不触发处理机制。

如果我将控制器更改为必须使用相同的 API 方法,这会导致另一个错误:

[RoutePrefix("api/Ads")]
public class AdsController : ApiController
{
    public IHttpActionResult Get()
    {
        return Ok(Ad.GetAds());
    }
    public IHttpActionResult Get(object name)
    { 
        return Ok();
    }
}

处理程序将捕获错误:

在这种情况下,错误是:

  Multiple actions were found that match the request: 

ExceptionLogger 和 ExceptionHandler 是否只捕获更高级别的 web api 引起的错误?以及我应该如何处理所有错误,异常过滤器是否也是必须添加的解决方案?

【问题讨论】:

    标签: c# error-handling exception-handling asp.net-web-api2 action-filter


    【解决方案1】:

    添加异常过滤器:

     public class MyExceptionFilter:ExceptionFilterAttribute
    {
        public override void OnException(HttpActionExecutedContext context)
        {
            var t = HandleException(context);
    
            t.Wait();
        }
    
        public override async Task OnExceptionAsync(HttpActionExecutedContext context, CancellationToken cancellationToken)
        {
           await HandleException(context);
        }
    
        private Task HandleException(HttpActionExecutedContext context)
        {
            context.Response = context.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, context.Exception.Message);
    
            return Task.CompletedTask;
        }
    }
    

    然后在你的WebApiConfig.Register 方法中添加这一行:

    config.Filters.Add(new MyExceptionFilter());
    

    【讨论】:

    • 我已经添加了异常过滤器,但它也不起作用。我也尝试过创建自己的异常并抛出它们,但它没有触发任何异常过滤器或异常记录器。我不知道我可能错过了什么。
    • 我可能是错的,但我认为您的Multiple actions were found that match the request: 错误不会被任何代码内处理处理......我可能真的错了。反正我也没想到。
    • 是的,因为它在执行操作之前就已经发生了。但是,问题是为什么任何机制都不会处理动作本身内部引发的错误,例如“throw new Exception()”。
    • 如果您在应用程序级别注册了一个 ExceptionFilter(在 Register 方法中),那么我发布的内容应该可以工作。我会摆脱 GlobalExceptionHandler。也许发布您的 Regsiter 和 StartUp 方法以供审核。
    • 如果我应该使用 ExceptionFilter 这意味着我应该丢弃扩展 ExceptionLogger 的 GlobalExceptionLogger?所以在这种情况下使用过滤器有什么好处,考虑到它只捕获动作的异常,而另一个捕获所有异常。你能说明一下吗?
    【解决方案2】:

    由于项目处于调试模式,ExceptionLogger 和过滤器没有捕获任何错误,在调试模式下它会抛出异常并停在那里,而在发布模式下,异常被记录器或过滤器捕获。

    【讨论】:

      猜你喜欢
      • 2017-02-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-12
      • 2013-04-08
      • 2023-02-10
      • 2010-11-05
      • 2012-05-04
      • 2016-12-02
      相关资源
      最近更新 更多