2015-01-21 9 views
1

Обратите внимание, что это не связано с получением электронной почты, созданной в традиционном смысле 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, но я не уверен, как это сделать.

Я чувствую, что зарегистрированное и контролируемое пользовательское событие (тогда поднятое в обработчике) было бы одним из способов ... но я не уверен, как действовать, поскольку я никогда не работал с событиями.

Как я могу реализовать это? Будут ли события идти или есть другой путь, который я мог бы предпринять?

+0

См. Это; http://stackoverflow.com/questions/7441062/how-to-use-elmah-to-manually-log-errors –

+0

@ RyanO'Neill Привет, я изначально шел по этому маршруту, но 'ErrorSignal' требует' exception', потому что это классические ошибки ASP, пойманные обработчиком .net. У меня возникла проблема с проецированием моего классического исключения asp в исключение .net. У меня был классический asp как тег в моем вопросе, но он был удален вчера (я думаю, это, вероятно, то, что натолкнуло этот вопрос на другое мнение) – Kritner

ответ

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); 
    } 
Смежные вопросы