手动发送ELMAH错误电子邮件

时间:2015-01-21 15:12:55

标签: c# asp.net elmah

请注意,这与以传统意义上的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注册的那个 - 但我不确定这样做。

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

我将如何实施此功能?事件是可行的,还是我可以采取另一条道路?

1 个答案:

答案 0 :(得分:0)

不确定您是否仍然需要它,但您可以在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);
    }