37

我尝试了许多 elmah nuget,但它们不适用于 ASP.NET Web API。有人知道为什么吗?有什么解决办法吗?

4

4 回答 4

24

使用 ELMAH 在 WEB API 中捕获异常有两种选择。

如果您想捕获在 Actions 和 Controllers 中遇到的错误,即在您的业务逻辑中,您可以创建一个 ActionFilterAttribute 并将这些异常记录到 ELMAH。

例子:

public class UnhandledExceptionFilter : ExceptionFilterAttribute {
    public override void OnException(HttpActionExecutedContext context) {
        Elmah.ErrorLog.GetDefault(HttpContext.Current).Log(new Elmah.Error(context.Exception));
    }
}

然后通过添加该过滤器进行接线。

public static class WebApiConfig {
    public static void Register(HttpConfiguration config) {
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

        config.Filters.Add(new UnhandledExceptionFilter());
    }
}

使用上述方法将不会处理以下错误:

  • 控制器构造函数抛出的异常。
  • 消息处理程序抛出的异常。
  • 路由期间抛出的异常。
  • 响应内容序列化过程中抛出的异常

参考: http: //blogs.msdn.com/b/webdev/archive/2012/11/16/capturing-unhandled-exceptions-in-asp-net-web-api-s-with-elmah.aspx & http: //www.asp.net/web-api/overview/error-handling/web-api-global-error-handling

为了让 ELMAH在全局级别记录 WEB API 错误,以便捕获所有 500 个服务器错误,请执行以下操作:

安装 nuget:https ://www.nuget.org/packages/Elmah.Contrib.WebApi/

将以下内容添加到 WebApiConfig

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        ...
        config.Services.Add(typeof(IExceptionLogger), new ElmahExceptionLogger());
        ...
    }
}

如果您想为 500 服务器错误显示自定义错误消息,您可以在 Web Api 中实现新的 ExceptionHandler(注意 ExceptionLogger 和 ExceptionHandler 是不同的。)

class OopsExceptionHandler : ExceptionHandler
{
    public override void HandleCore(ExceptionHandlerContext context)
    {
        context.Result = new TextPlainErrorResult
        {
            Request = context.ExceptionContext.Request,
            Content = "Oops! Sorry! Something went wrong." +
                      "Please contact support@contoso.com so we can try to fix it."
        };
    }

    private class TextPlainErrorResult : IHttpActionResult
    {
        public HttpRequestMessage Request { get; set; }

        public string Content { get; set; }

        public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
        {
            HttpResponseMessage response = 
                             new HttpResponseMessage(HttpStatusCode.InternalServerError);
            response.Content = new StringContent(Content);
            response.RequestMessage = Request;
            return Task.FromResult(response);
        }
    }
}

参考:http ://www.asp.net/web-api/overview/error-handling/web-api-global-error-handling

于 2015-03-01T17:19:51.420 回答
15

一种选择是设置自定义 ExceptionFilterAttribute,覆盖 OnException 方法,并从那里向 Elmah 发出信号。请参阅下面的示例链接

Elmah WebAPI 示例

于 2012-04-12T04:22:50.810 回答
13

检查以下 URL,它详细描述了如何将 elmah 与 Web API 一起使用:

http://blogs.msdn.com/b/webdev/archive/2012/11/16/capturing-unhandled-exceptions-in-asp-net-web-api-s-with-elmah.aspx

您还可以使用下面的 NuGet 包:

Install-Package Elmah.Contrib.WebApi

用法:

只需在应用程序启动期间或逐个控制器注册它。

protected void Application_Start()
{
    GlobalConfiguration.Configuration.Filters.Add(new ElmahHandleErrorApiAttribute());

    ...
}

(来自Elmah.Contrib.WebApi GitHub 存储库

于 2014-02-18T14:07:32.470 回答
4

对于 ASP.NET Web API,使用 Elmah.MVC nuget 包,详细信息如下

摘自:如何使用 ASP.NET MVC 4 设置 ELMAH.MVC?

什么是艾尔玛?

ELMAH 是一个开源项目,其目的是记录和报告 ASP.NET Web 应用程序中未处理的异常。

为什么要使用 Elmah ?

ELMAH 充当未处理的 ASP.NET 异常的不显眼拦截器,这些异常通常以 ASP.NET黄屏死机显示

所以现在我们知道什么以及为什么要使用 Elmah,让我们快速开始了解如何在您的 ASP.NET MVC 项目中使用 Elmah。

第 1 步:右键单击您的解决方案并选择“管理 Nuget 包”选项在此处输入图像描述

第 2 步:在 Nuget 包管理器中搜索“Elmah”并安装Elmah.MVC nuget 扩展。 在此处输入图像描述 Nuget 包管理器将下载并添加所需的 dll 并修改 web.config<appSetting>以供 Elmah 工作在此处输入图像描述

第3步:就是这样!您的 Elmah 现在已准备好进行测试。我生成了一个 404 来测试我的 Elmah 是否有效,ELMAH 可以通过这个 url 访问:http: //yourapp.com/elmah在此处输入图像描述 在此处输入图像描述

希望这可以帮助 :)

延伸阅读:

于 2013-03-23T11:47:11.930 回答