加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – Elmah.MVC设置

发布时间:2020-12-15 22:03:29 所属栏目:百科 来源:网络整理
导读:我正在尝试使用Elmah启动并运行MVC 5 WebAPI应用程序.我找到的所有文档似乎都以“通过nuget安装它”开始和结束,并假设它将覆盖它,但我显然遗漏了一些东西.我通过nuget安装了Elmah.MVC 2.1.1,我可以在/ elmah查看错误日志.我能够请求无效路由,并且看到Elmah记
我正在尝试使用Elmah启动并运行MVC 5 WebAPI应用程序.我找到的所有文档似乎都以“通过nuget安装它”开始和结束,并假设它将覆盖它,但我显然遗漏了一些东西.我通过nuget安装了Elmah.MVC 2.1.1,我可以在/ elmah查看错误日志.我能够请求无效路由,并且看到Elmah记录了生成的404错误,即使打开了customErrors也是如此.但是,如果我在控制器中生成未处理的错误,或者在控制器实例化期间,则没有任何内容记录到Elmah.例如:

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

我可以整天打电话给这个,Elmah日志中没有任何内容.添加标准的HandleError属性不会改变任何东西,并且一点点文档here似乎非常明确,我不应该创建自定义HandleError属性.

我使用Ninject进行DI,同样如果我打破依赖项绑定,我会得到一个很好的错误,如下所示:

{
    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记录控制器内未处理的任何异常?

解决方法

弄清楚了.这类似于旧的ExceptionFilter机制,但更全局的ExceptionFilters只能处理来自特定控制器的未处理异常,而不能处理堆栈中可能出现更高的错误.首先,我需要一个简单的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).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读