gpt4 book ai didi

c# - Elmah.MVC 设置

转载 作者:行者123 更新时间:2023-11-30 12:45:45 24 4
gpt4 key购买 nike

我正在尝试使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com