Обратите внимание, что это не связано с получением электронной почты, созданной в традиционном смысле elmah, я уже успешно это сделал.Отправка электронной почты электронной почты ELMAH вручную
Я пытаюсь использовать проект github (https://github.com/dylanbeattie/ElmahASP), который был создан для отправки «реальных» ошибок в elmah с классических страниц asp.
У меня это реализовано так, что в проекте на .net-страницах отправляются ошибки/отправленные сообщения. На классических страниц ASP, ошибки регистрируются, но не электронная почта не передается (здесь лежит моя проблема)
Ошибки регистрируются в классическом осины через пользовательский обработчик (при условии, проектом GitHub):
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!");
}
Это, однако, не работает, я совершенно уверен, что это из-за меня newing вверх ошибка почты модуль , а не используя тот, который я (предполагаю) зарегистрирован в init, но я не уверен, как это сделать.
Я чувствую, что зарегистрированное и контролируемое пользовательское событие (тогда поднятое в обработчике) было бы одним из способов ... но я не уверен, как действовать, поскольку я никогда не работал с событиями.
Как я могу реализовать это? Будут ли события идти или есть другой путь, который я мог бы предпринять?
См. Это; http://stackoverflow.com/questions/7441062/how-to-use-elmah-to-manually-log-errors –
@ RyanO'Neill Привет, я изначально шел по этому маршруту, но 'ErrorSignal' требует' exception', потому что это классические ошибки ASP, пойманные обработчиком .net. У меня возникла проблема с проецированием моего классического исключения asp в исключение .net. У меня был классический asp как тег в моем вопросе, но он был удален вчера (я думаю, это, вероятно, то, что натолкнуло этот вопрос на другое мнение) – Kritner