请注意,这与以传统意义上的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注册的那个 - 但我不确定这样做。
我觉得注册和监控自定义事件(然后在处理程序中引发)将是一种方法......但我不确定如何继续,因为我从未使用过事件。
我将如何实施此功能?事件是可行的,还是我可以采取另一条道路?
答案 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);
}