【问题标题】:Sending ELMAH error email manually手动发送 ELMAH 错误电子邮件
【发布时间】:2015-01-21 15:12:54
【问题描述】:

请注意,这与在传统意义上的 elmah 中设置电子邮件无关,我已经成功地这样做了。

我正在尝试利用一个 github 项目 (https://github.com/dylanbeattie/ElmahASP),该项目旨在从经典的 ASP 页面向 elmah 发送“真实”错误。

我已经实现了这一点,以便在 .net 页面上的项目中记录错误/发送电子邮件。在经典的 asp 页面上,记录了错误,但没有发送电子邮件(这是我的问题)

错误通过自定义处理程序(由 github 项目提供)记录在经典 asp 中:

    public void ProcessRequest(HttpContext context) {
        try {
            var jsonData = new StreamReader(context.Request.InputStream).ReadToEnd();
            var aspError = JsonConvert.DeserializeObject<RemoteError>(jsonData);
            var elmahError = aspError.ToElmahError();
            //TODO: might be worth putting some code in here that will determine the username based on the cookie collection in the deserialized error object.
            ErrorLog.GetDefault(HttpContext.Current).Log(elmahError);
            context.Response.Write("Error logged OK!");
        } catch (Exception ex) {
            ErrorSignal.FromCurrentContext().Raise(ex);
        }
        context.Response.Write("THis is a response!");
    }

看起来执行ErrorLog.Log 确实记录了错误,但绕过了需要抛出的会导致发送错误电子邮件的事件。处理发送电子邮件的 elmah 类有几个非公开的发送邮件的方法,我想使用这些方法,但是由于我不理解......所以以下方法不起作用。

我已尝试编写邮件模块的扩展,并已成功注册(因为我已确认 aspx 页面仍在发送电子邮件,但仍然遇到经典 asp 错误邮件的问题)。这是我的课:

public class ErrorMailModule : Elmah.ErrorMailModule
{
    public void SendErrorMail(Elmah.Error error)
    {
        base.ReportError(error);
    }
}

然后我将处理程序从上面更改为:

    public void ProcessRequest(HttpContext context) {
        try {
            var jsonData = new StreamReader(context.Request.InputStream).ReadToEnd();
            var aspError = JsonConvert.DeserializeObject<RemoteError>(jsonData);
            var elmahError = aspError.ToElmahError();
            //TODO: might be worth putting some code in here that will determine the username based on the cookie collection in the deserialized error object.
            ErrorLog.GetDefault(HttpContext.Current).Log(elmahError);

            ErrorMailModule mail = new ErrorMailModule;
            mail.SendErrorMail(elmahError);

            context.Response.Write("Error logged OK!");
        } catch (Exception ex) {
            ErrorSignal.FromCurrentContext().Raise(ex);
        }
        context.Response.Write("THis is a response!");
    }

但这不起作用,我很确定这是因为我更新了一个错误邮件模块,而不是利用我(假设)在 init 注册的那个 - 但我不确定如何这样做。

我觉得注册和监视自定义事件(然后在处理程序中引发)将是一种方法......但我不确定如何继续,因为我从未处理过事件。

我将如何实现这一点?事件是要走的路还是我可以走的另一条路?

【问题讨论】:

  • @RyanO'Neill 嘿,谢谢,我最初是沿着这条路线走的,但 ErrorSignal 需要传递给它的 exception,因为这是 .net 处理程序捕获的经典 ASP 错误,我在将我的经典 asp 异常投射到 .net 异常时遇到了麻烦......我的问题中确实有经典 asp 作为标签,但它昨天被删除了(我认为这可能是这个问题引起另一种观点的原因)跨度>

标签: c# asp.net elmah


【解决方案1】:

不确定你是否还需要这个,但你可以在 OnException 事件处理程序中手动触发它。

protected override void OnException(ExceptionContext filterContext)
    {
        var jsonData = new StreamReader(filterContext.Request.InputStream).ReadToEnd();
        var aspError = JsonConvert.DeserializeObject<RemoteError>(jsonData);
        var elmahError = aspError.ToElmahError();
        ErrorLog.GetDefault(HttpContext.Current).Log(elmahError);

        ErrorMailModule mail = new ErrorMailModule;
        mail.SendErrorMail(elmahError); 
        Elmah.ErrorSignal.FromCurrentContext().Raise(filterContext.Exception); // to store error
        base.OnException(filterContext);
    }

【讨论】:

    猜你喜欢
    • 2017-05-18
    • 2010-09-07
    • 2013-04-04
    • 2017-01-12
    • 2016-12-12
    • 2013-02-10
    • 2011-07-03
    • 2023-03-26
    • 2014-10-05
    相关资源
    最近更新 更多