c# - Elmah.MVC 设置

标签 c# asp.net-mvc elmah elmah.mvc

我正在尝试使用 Elmah 启动并运行 MVC 5 WebAPI 应用程序。我找到的所有文档似乎都以“通过 nuget 安装它”开始和结束,并假设这将涵盖它,但我显然遗漏了一些东西。我已经通过 nuget 安装了 Elmah.MVC 2.1.1,我可以在/elmah 查看错误日志。我能够请求一个无效的路由,并看到 Elmah 记录了由此产生的 404 错误,即使 customErrors 已打开。但是,如果我在 Controller 内或在 Controller 实例化期间生成未处理的错误,则不会向 Elmah 记录任何内容。例如:

[HttpGet, Route("api/health")]
[ApiExplorerSettings(IgnoreApi = true)]
public HttpResponseMessage GetHealth()
{
    throw new Exception("Whoops.");
}

我可以整天调用它,但 Elmah 日志中什么也没有显示。添加标准的 HandleError 属性不会改变任何东西,一点点文档 here似乎很明确我不应该创建自定义 HandleError 属性。

我将 Ninject 用于 DI,类似地,如果我打破依赖绑定(bind),我会得到一个很好的错误,如下所示:

{
    Message: "An error has occurred."
    ExceptionMessage: "An error occurred when trying to create a controller of type 'HealthController'. Make sure that the controller has a parameterless public constructor."
    ...
}

但在那种情况下,Elmah 日志中也没有任何内容。

我假设在这两种情况下,这是因为 MVC 正在为我处理这些错误(将异常格式化为 JSON 等),而不是将它们传递给 Elmah。我该如何配置才能让 Elmah 记录任何未在 Controller 内处理的异常?

最佳答案

想通了。这类似于旧的 ExceptionFilter 机制,但更具全局性,因为 ExceptionFilters 仅适用于来自特定 Controller 的未处理异常,而不适用于可能在堆栈中更高层出现的错误。首先,我需要一个简单的 ExceptionLogger 来将异常传递给 Elmah:

public class ElmahExceptionLogger : ExceptionLogger
{
    public override void Log(ExceptionLoggerContext context)
    {
        Elmah.ErrorLog.GetDefault(HttpContext.Current).Log(new Elmah.Error(context.Exception));
    }
}

然后在WebApiConfig.cs中添加:

public static void Register(HttpConfiguration config)
{
    // Web API routes
    config.MapHttpAttributeRoutes();

    config.Services.Add(typeof(IExceptionLogger), new ElmahExceptionLogger());
}

这确实需要最新最好的 MVC/WebAPI(目前为 5.1.1)。

关于c# - Elmah.MVC 设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23204167/

相关文章:

asp.net-mvc - Elmah.MVC 与 Elmah.contrib.Mvc

asp.net-mvc-4 - MVC4 Elmah 位置路径无法识别

c# - 如何在 C# Unity 中使用带有二维数组的 C 结构

asp.net-mvc - 从Web安装程序项目检查MVC.net是否已安装

elmah - 有没有人为ELMAH开发前端?

asp.net - MVC 5 -> MVC 5.1 迁移。智能感知问题

asp.net-mvc - 如何让浏览器链接在 asp mvc 6 项目中工作

c# - 将集合均匀分布到新数组中

c# - 如何在我的应用程序中创建电子邮件模板

c# - 将图像另存为 Tiff