如何让 ELMAH 与 ASP.NET MVC [HandleError] 属性一起使用?

2023-11-23

我正在尝试使用 ELMAH 记录 ASP.NET MVC 应用程序中的错误,但是当我在控制器上使用 [HandleError] 属性时,ELMAH 在发生错误时不会记录任何错误。

正如我猜测的那样,因为 ELMAH 只记录未处理的错误,并且 [HandleError] 属性正在处理错误,因此不需要记录它。

我该如何修改或如何修改该属性,以便 ELMAH 知道存在错误并记录它。

Edit:让我确保每个人都理解,我知道我可以修改属性,这不是我要问的问题...使用handleerror属性时,ELMAH被绕过,这意味着它不会看到有错误,因为它已经被处理了属性...我要问的是有一种方法可以让 ELMAH 看到错误并记录它,即使属性处理了它...我四处搜索,没有看到任何方法可以调用来强制它记录错误....


你可以子类化HandleErrorAttribute并覆盖它的OnException成员(无需复制),以便仅在基本实现处理异常时才使用 ELMAH 记录异常。您需要的最少代码量如下:

using System.Web.Mvc;
using Elmah;

public class HandleErrorAttribute : System.Web.Mvc.HandleErrorAttribute
{
    public override void OnException(ExceptionContext context)
    {
        base.OnException(context);
        if (!context.ExceptionHandled) 
            return;
        var httpContext = context.HttpContext.ApplicationInstance.Context;
        var signal = ErrorSignal.FromContext(httpContext);
        signal.Raise(context.Exception, httpContext);
    }
}

首先调用基本实现,使其有机会将异常标记为正在处理。只有这样才会发出异常信号。上面的代码很简单,如果在以下环境中使用可能会出现问题HttpContext可能不可用,例如测试。因此,您将需要更具防御性的代码(代价是稍微长一些):

using System.Web;
using System.Web.Mvc;
using Elmah;

public class HandleErrorAttribute : System.Web.Mvc.HandleErrorAttribute
{
    public override void OnException(ExceptionContext context)
    {
        base.OnException(context);
        if (!context.ExceptionHandled       // if unhandled, will be logged anyhow
            || TryRaiseErrorSignal(context) // prefer signaling, if possible
            || IsFiltered(context))         // filtered?
            return;

        LogException(context);
    }

    private static bool TryRaiseErrorSignal(ExceptionContext context)
    {
        var httpContext = GetHttpContextImpl(context.HttpContext);
        if (httpContext == null)
            return false;
        var signal = ErrorSignal.FromContext(httpContext);
        if (signal == null)
            return false;
        signal.Raise(context.Exception, httpContext);
        return true;
    }

    private static bool IsFiltered(ExceptionContext context)
    {
        var config = context.HttpContext.GetSection("elmah/errorFilter")
                        as ErrorFilterConfiguration;

        if (config == null)
            return false;

        var testContext = new ErrorFilterModule.AssertionHelperContext(
                              context.Exception, 
                              GetHttpContextImpl(context.HttpContext));
        return config.Assertion.Test(testContext);
    }

    private static void LogException(ExceptionContext context)
    {
        var httpContext = GetHttpContextImpl(context.HttpContext);
        var error = new Error(context.Exception, httpContext);
        ErrorLog.GetDefault(httpContext).Log(error);
    }

    private static HttpContext GetHttpContextImpl(HttpContextBase context)
    {
        return context.ApplicationInstance.Context;
    }
}

第二个版本将尝试使用错误信号首先从 ELMAH 开始,其中涉及完全配置的管道,如日志记录、邮件、过滤等等。如果失败,它会尝试查看是否应过滤该错误。如果不是,则仅记录错误。此实现不处理邮件通知。如果可以发出异常信号,则将发送一封邮件(如果已配置)。

您可能还需要注意,如果有多个HandleErrorAttribute实例有效,则不会发生重复日志记录,但上面的两个示例应该可以帮助您入门。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何让 ELMAH 与 ASP.NET MVC [HandleError] 属性一起使用? 的相关文章

随机推荐

  • 使用 JDBC 在 Oracle 数据库上创建 Java

    我正在尝试使用 JDBC 在 Oracle 数据库上创建 Java 源对象 我要创建的源如下 create or replace and resolve java source named BlobIO as package dbjava
  • Java中int的取值范围

    据我了解 intJava 中的范围应该是 2 31 到 2 31 1 但是当我用 20 运行这个代码片段时 public class Factorial public int factorial int n int fac 1 for in
  • avc:在 Android 10 上使用 uds 时被拒绝 { connectto }

    我在 Android 10 设备上运行 2 个应用程序 它们通过 uds 相互通信 一切正常 直到我将应用程序设置更改为目标 Android 10 我在 logcat 中收到以下错误 09 07 13 33 18 136 14573 145
  • C 作为面向对象的语言

    您能否为 C 语言建议一种语法 使其以与面向对象语言类似的方式使用它 我知道它们不可能相同 并且某些关键字在 C 中不存在 但我想知道是否有办法即使在 C 程序中也能利用某些方面 如继承 You can implement polymorp
  • 将数据框通过管道传递给一个函数,该函数的参数通过管道传递一个点

    如何将数据帧传送到一个其参数传送点的函数 mpg gt rbind gt rev rep xi length out nvar 中的错误 尝试复制 闭包 类型的对象 另一个例子 mpg gt gt arrange manufacturer
  • 如何使用 iText PdfStamper 将内容添加到 PDF

    我正在开发一个系统 我必须在其中添加一些图像到现有的 PDF 文档中 这对于 iText 5 1 3 非常有效 但由于某种原因 在包含扫描图像的 PDF 中 它不会添加任何图像 这是链接到PDF文档无法使用 PdfStamper 修改 这是
  • WPF:无法设置属性元素的属性奇怪

    private TextBlock caption new TextBlock public TextBlock Caption get return caption set caption value
  • Groovy 2.0 静态编译的性能如何

    我发现最近发布的 Groovy 2 0 包括可选的静态编译以及其他一些附加好处 例如可选的静态类型检查 经过一番搜索后 我无法找到任何将 Groovy 的性能 使用静态编译 与 Java 甚至 Scala 进行比较的广泛基准测试 有谁知道这
  • 为什么我不能在 std::transform 中使用 std::get<0> ?

    在尝试编译以下代码时 它将复制maps 的键vector map
  • Angular 指令中带有 require 的 bindToController

    如果我的指令使用 require 要使用不同的指令 例如ngModel 并使用隔离范围我如何能够使用bindToController语法并且仍然能够访问可注入项 ngModelController 从控制器 如果没有的话你会怎么做bindT
  • Git 缺少提交错误

    我们最近更改了存储库的位置 并且发现文件中缺少几个月前的提交 我们拥有 Git 的旧服务器已关闭 因此无法从那里恢复提交 这是我得到的错误 git fsck full broken link from commit 58ba71d080b1
  • Rails 4 枚举验证

    这是我第一次在 Rails 4 中使用枚举 我遇到了一些问题 想到了一些肮脏的解决方案 并想检查是否有更优雅的解决方案 这是我的表迁移相关部分 create table shippings do t t column status inte
  • leaflet-draw 删除按钮删除“全部清除”操作

    如何从删除按钮中删除 全部清除 操作传单抽奖编辑工具栏 我知道你可以删除整个delete按钮 但仍需要删除个别项目 基本上寻找一种方法来防止用户删除地图中的每个项目 编辑工具栏测试是否存在removeAllLayers按钮处理程序上的成员
  • Python PIL 成像库 FileNotFoundError

    我目前正在开发一个 tkinter GUI 项目 该项目接收用户的平均值并将其返回给他们 我希望使用 PIL 库在我的父窗口中显示图像 昨天这个库工作正常并在目录中找到我的图像 但今天似乎无法找到该目录 有人可以帮助我并指导我 我不知道为什
  • 每个框中带有标签的马赛克图,显示所有观察值的名称和百分比

    我想创建一个马赛克图 R 包 vcd 请参见例如http cran r project org web packages vcd vignettes residual shadings pdf 在绘图内带有标签 标签应显示各种因素的组合或一
  • Docker/LXC 容器是正在运行的应用程序还是内存中的东西?

    我刚刚读了优秀的SO问题 Docker 和虚拟机有什么区别 然而 被接受的答案让我想要更多一点 I sort of了解容器 Docker LXC 我不明白其中的区别 来使用称为libcontainer和 AuFS 使数十个 数百个甚至数千个
  • 如何在 Thymeleaf 中分割字符串

    我有像这样的图像名称wange 25011 jpg wange 25011 1 jpg或 null 我想将它们拆分为wange 25011 jpg and wange 25011 1 jpg 或者如果为空则不拆分 我尝试了如下代码 但没有工
  • Retrofit 2 和 RxJava 错误处理运算符

    我在我的项目中使用 Retrofit 2 以及 Observable 接口和 Result 包装器 例子 POST api login Observable
  • 以编程方式设置 ConstraintLayout 宽度以匹配父宽度

    在 Android 应用程序中 我尝试以编程方式添加自定义ConstraintLayout垂直方向的视图LinearLayout 我设置了LayoutParams to MATCH PARENT对于宽度和WRAP CONTENT对于高度在C
  • 如何让 ELMAH 与 ASP.NET MVC [HandleError] 属性一起使用?

    我正在尝试使用 ELMAH 记录 ASP NET MVC 应用程序中的错误 但是当我在控制器上使用 HandleError 属性时 ELMAH 在发生错误时不会记录任何错误 正如我猜测的那样 因为 ELMAH 只记录未处理的错误 并且 Ha