【问题标题】:How do I set up a global error handler in WebApi?如何在 WebApi 中设置全局错误处理程序?
【发布时间】:2013-07-01 05:25:48
【问题描述】:

我正在构建一个 .NET WebApi 应用程序,我想设置一个全局错误处理程序(基本上是一个在应用程序的任何地方出现异常时执行的函数)。 this link 对此表示遗憾,但提供了几种解决方法。不幸的是,我似乎找不到任何有用的文档。

这是我的要求:

  • 在动作方法和其他地方(例如控制器解析)捕获异常。
  • 在我的处理过程中可以访问原始异常对象。
  • 在错误处理过程中可以访问我的 (Autofac) IOC 容器中的服务(这是一个强烈的愿望,但不是必须的)。
  • 不依赖于 MVC(我使用的是纯 WebApi)。不需要对 IIS 的依赖。

我该如何进行设置?

【问题讨论】:

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


    【解决方案1】:

    如果您更新到 Web API v2.1,可通过 Nuget 使用以下命令:

    Install-Package Microsoft.AspNet.WebApi
    

    您可以通过从 Exception Logger 继承来创建全局异常处理程序。

    这是一个例子:

    class TraceExceptionLogger : ExceptionLogger
    {
        public override void LogCore(ExceptionLoggerContext context)
        {
            Trace.TraceError(context.ExceptionContext.Exception.ToString());
        }
    }
    

    更多详情请参阅此处的发行说明:http://www.asp.net/web-api/overview/releases/whats-new-in-aspnet-web-api-21#global-error

    【讨论】:

    • 知道这是否也可以用于 MVC 应用程序吗?
    • 您应该发布完整的解决方案,而不是链接到页面。这仍然需要调用:config.Services.Add(typeof(IExceptionLogger), new TraceSourceExceptionLogger(new TraceSource("MyTraceSource", SourceLevels.All)));
    【解决方案2】:

    您应该注意以下几个选项:

    事件AppDomain.CurrentDomain.FirstChanceException

    无论是否处理,都会为每个异常触发。在您的特定处理程序之前使用它来记录等。

    事件AppDomain.CurrentDomain.UnhandledException:

    将针对代码中未处理的每个异常触发

    您需要在可以访问您的 IOC 容器等的服务中创建处理程序

    【讨论】:

    • UnhandlesExceptionHandler 在 Web 服务器上运行时会真正起作用,还是抛出的异常会被底层服务器吞噬?
    • 从我的测试来看,UnhandledException 处理程序从未真正运行过......似乎底层服务器正在某个地方捕获异常。
    • 我承认我没有在 WebApi 中尝试过。抱歉,这对您不起作用。你有没有考虑过像 ELMAH code.google.com/p/elmah 这样的东西。这提供了非常广泛的异常日志记录。这里有一篇文章如何整合tugberkugurlu.com/archive/asp-net-web-api-and-elmah-integration
    • 基于该帖子,WebApi 的 Elmah 似乎使用 ErrorSignal.FromCurrentContext(),它使用 HttpContext.Current,(据我了解)将我与 IIS 联系起来。
    猜你喜欢
    • 1970-01-01
    • 2011-10-14
    • 2013-03-06
    • 2014-01-14
    • 2023-04-04
    • 1970-01-01
    • 2018-07-15
    • 2019-03-07
    • 1970-01-01
    相关资源
    最近更新 更多