【问题标题】:How to set up Elmah with ASP.NET Web API如何使用 ASP.NET Web API 设置 Elmah
【发布时间】:2012-04-24 09:17:12
【问题描述】:

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

【问题讨论】:

    标签: asp.net-web-api elmah


    【解决方案1】:

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

    如果您想捕获 在操作和控制器中遇到的错误,即在您的业务逻辑中,您可以创建一个 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

    【讨论】:

    • 谢谢伙计,这很有帮助。我仍然摸不着头脑,直到我弄清楚如何让它在我的情况下工作(WebApi 也在 MVC 站点的上下文中运行);答案就是安装 Elmah.MVC 包。我在这里的博客文章中对此进行了稍微扩展:dbarrowstechblog.blogspot.co.uk/2015/03/…
    • 直接调用Elmah.ErrorLog.GetDefault(HttpContext.Current).Log 的第一个(简单)解决方案工作正常,但它不发送电子邮件(如果您是这样设置 Elmah 的)- 它只是记录。如果您希望 Elmah 以您在 web.config 中指定的方式处理您的异常,那么我建议将 .Log 调用替换为 Elmah.ErrorSignal.FromCurrentContext().Raise(context.Exception);,这将触发正常的 Elmah 处理。
    【解决方案2】:

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

    Elmah WebAPI Sample

    【讨论】:

    • 我一直在努力解决的问题(但仍然没有时间解决)是在我的 elmah 访问中使用表单身份验证与我的 api 上的基本身份验证混合
    【解决方案3】:

    查看以下 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());
    
        ...
    }
    

    (来自the Elmah.Contrib.WebApi GitHub repo

    【讨论】:

    • 这对我有用,应该是公认的解决方案。
    【解决方案4】:

    对于 ASP.NET Web API,使用 Elmah.MVC nuget 包,下面给出了详细信息

    取自:HOW TO SETUP ELMAH.MVC WITH ASP.NET MVC 4 ?

    什么是艾玛?

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

    为什么要使用 Elmah ?

    ELMAH 充当未处理的 ASP.NET 异常的不显眼拦截器,这些异常通常通过 ASP.NET yellow screen of death 表现出来。

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

    第 1 步: 右键单击​​您的解决方案并选择“管理 Nuget 包”选项

    第 2 步: 在 Nuget 包管理器中搜索“Elmah”并安装 Elmah.MVC nuget 扩展。 Nuget 包管理器将下载并添加所需的 dll,并将 Elmah 的 web.config 的 &lt;appSetting&gt; 修改为 work。

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

    希望这会有所帮助:)

    进一步阅读:

    【讨论】:

    • 您是从ApiController 生成404 吗?如果不是,并且它是一个标准的 MVC 控制器,那么您就完全错过了问题的重点。
    • 已从普通控制器生成 404,这只是一个示例,如果我使用 webapi 控制器并导致 404,情况也是如此。
    • 你真的试过了吗?因为我很确定情况并非如此。异常处理在 Web API 中的工作方式不同。
    • @Doozer1979 说谁?你只需要注册你的HttpFilters这里是如何做到的stackoverflow.com/questions/10059563/…
    • 那么,为什么不把这部分作为你的答案,而不是留下一些对 OP 的问题不起作用的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-03
    • 2016-03-10
    • 2020-07-09
    • 2019-10-27
    相关资源
    最近更新 更多