如何使用ASP.NET Web API设置Elmah

36 elmah asp.net-web-api

我尝试过很多elmah nugets,但是他们没有使用ASP.NET Web API.有人知道为什么吗?那有什么工作吗?

jax*_*xbo 23

使用ELMAH捕获WEB API中的异常有两种选择.

如果要捕获在操作和控制器中遇到的错误,即在业务逻辑中,可以创建ActionFilterAttribute并将这些异常记录到ELMAH.

例:

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

然后通过添加该过滤器进行连线.

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());
    }
}
Run Code Online (Sandbox Code Playgroud)

使用上述方法,将无法处理以下错误:

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

参考:http://blogs.msdn.com/b/webdev/archive/2012/11/16/capturing-unhandled-exceptions-in-asp-net-web-api-s-with-elmah.aspxHTTP: //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());
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

如果要显示500 Server错误的自定义错误消息,可以在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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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


cec*_*lip 15

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

Elmah WebAPI示例


Ahm*_*med 10

检查下面描述的URL,详细说明如何在Web API中使用elmah:

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
Run Code Online (Sandbox Code Playgroud)

用法:

只需在应用程序启动期间或逐个控制器上注册即可.

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

    ...
}
Run Code Online (Sandbox Code Playgroud)

(来自Elmah.Contrib.WebApi GitHub repo)


Yas*_*ser 6

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

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

什么是Elmah?

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

为什么要用Elmah?

ELMAH充当了未处理的ASP.NET异常的不引人注意的拦截器,这些异常通常表现在死亡的ASP.NET 黄色屏幕上.

所以现在我们知道使用Elmah的原因和原因,让我们快速了解如何在您的ASP.NET MVC项目中使用Elmah.

第1步:右键单击您的解决方案,然后选择"管理Nuget包"选项在此输入图像描述

第2步:在Nuget Package管理器中搜索"Elmah"并安装Elmah.MVC nuget扩展. 在此输入图像描述 Nuget包管理器将下载并添加所需的dll,并将<appSetting>Elmah 的web.config修改为wo在此输入图像描述RK.

第3步:就是这样!你的Elmah现在准备好测试了.:我已经产生了404来测试,如果我的作品ELMAH,ELMAH可以通过这个网址访问,http://yourapp.com/elmah. 在此输入图像描述 在此输入图像描述

希望这可以帮助 :)

进一步阅读:

  • 你真的尝试过吗?因为我很确定事实并非如此.异常处理在Web API中的工作方式不同. (14认同)
  • Elmah.MVC不适用于API控制器. (5认同)
  • 你是从'ApiController`生成404的吗?如果没有,并且它是一个标准的MVC控制器,你完全错过了问题的重点. (4认同)
  • 那么,为什么不把那部分答案作出答案,而不是留下一些对OP的问题不起作用的东西. (2认同)