首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Elmah.MVC设置

Elmah.MVC设置
EN

Stack Overflow用户
提问于 2014-04-21 19:11:25
回答 1查看 3.1K关注 0票数 4

我正试图与Elmah一起运行MVC 5 WebAPI应用程序。我发现的所有文档似乎都以“通过nuget安装它”作为开头和结尾,并假设这将覆盖它,但我显然遗漏了一些东西。我已经通过nuget安装了Elmah.MVC 2.1.1,并且能够在/elmah上查看错误日志。我能够请求一个无效的路由,并看到最终的404错误正在由Elmah记录,即使打开了customErrors。但是,如果我在控制器内或在控制器实例化期间生成一个未处理的错误,则不会将任何信息记录到Elmah。例如:

代码语言:javascript
运行
复制
[HttpGet, Route("api/health")]
[ApiExplorerSettings(IgnoreApi = true)]
public HttpResponseMessage GetHealth()
{
    throw new Exception("Whoops.");
}

我可以打一整天电话,但在Elmah日志里什么都没有。添加标准的HandleError属性不会改变任何事情,而且一点点的docs 这里似乎很明显,我不应该创建一个自定义的HandleError属性。

对于DI,我使用Ninject,类似地,如果我破坏了依赖项绑定,我将得到一个很好的错误,如下所示:

代码语言:javascript
运行
复制
{
    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记录没有在控制器中处理的异常?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-23 18:34:28

弄明白了。这类似于旧的ExceptionFilter机制,但更具有全局性,因为ExceptionFilters只处理来自特定控制器的未处理异常,而不处理可能在堆栈中出现更高级别的错误。首先,我需要一个简单的ExceptionLogger来向Elmah传递异常:

代码语言:javascript
运行
复制
public class ElmahExceptionLogger : ExceptionLogger
{
    public override void Log(ExceptionLoggerContext context)
    {
        Elmah.ErrorLog.GetDefault(HttpContext.Current).Log(new Elmah.Error(context.Exception));
    }
}

然后在WebApiConfig.cs中添加了以下内容:

代码语言:javascript
运行
复制
public static void Register(HttpConfiguration config)
{
    // Web API routes
    config.MapHttpAttributeRoutes();

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23204167

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档