Dados Elmah YSOD personalizados
Pergunta
Estou usando Elmah com ASP.NET e me perguntando como adicionaria dados personalizados, como uma variável de sessão, a um email de exceção não tratado.
Tentei vários manipuladores no arquivo Global.asax, mas não consigo encontrar o correto.
Solução
Para isso, acho que você precisaria modificar o Elmah fonte e recompilar.Não deve ser muito difícil de conseguir.Se você der uma olhada no construtor do Elmah.Error
classe, o HttpContext
é transmitido, a partir do qual você poderá obter as informações necessárias, por exemplo.Sessão, variáveis de formulário etc.Você pode adicionar campos personalizados ao Elmah.Error
classe para esses dados
Eu acho que o Elmah.ErrorMailHtmlFormatter
classe é onde o e-mail é construído usando um HtmlTextWriter
, e aqui você pode inserir código no RenderSummary()
método para incluir os campos personalizados que você adicionou ao Elmah.Error
.
Eu sei que pode ser difícil começar a trabalhar com o código-fonte, mas pessoalmente acho que é a maneira mais limpa, já que atualmente não há facilidade para modelos de relatório/e-mail, e é melhor usar algo para alterar a saída depois de gerada.
Outras dicas
A resposta de Andrew ajudou muito, obrigado.Acabei fazendo o seguinte:
- Adicionado um evento OnBuilding ao módulo http ErrorMail.Os argumentos de evento para este evento possuem uma propriedade NameValueCollection.
- Lidei com o evento OnBuilding em global.asax.
- Como os HttpModules nem sempre têm acesso ao sessionstate, esp.se a exceção ocorrer antes do carregamento da sessão, copiei os dados que queria relatar no cache HttpApplication (indexado por sessionid).
- Quando ocorre uma exceção, retiro os dados que desejo do cache do aplicativo por meio do ID de sessão armazenado na solicitação (especificamente, no cookie).Eu gero um NameValueCollection a partir desses dados e o envio de volta para o httpmodule por meio dos argumentos OnBuilding.
- Os dados são então renderizados para email de forma semelhante à forma como a seção de variáveis do servidor é renderizada.