Estou trabalhando em um projeto que utiliza o Health Monitoring para notificações de que alguma falha ocorreu na aplicação. Essa configuração faz com que qualquer exceção não tratada, seja capturada pelo Health Monitoring e a seção customErrors garante uma página amigável para o usuário final.
A maioria dos erros não tratados são ocasionados por certos valores que são passados através de algum campo no formulário e, muito raramente, através de query strings (no caso deste projeto). A configuração padrão do Health Monitoring traz a stack trace do erro que ocorreu e outras informações relevantes ao problema, como o usuário, tipo da exceção, servidor, processo, etc. O problema é que, para simular o erro em um ambiente de teste ou até mesmo em produção, é necessário termos os mesmos valores especificados pelo usuário, para assim tornar essa simulação o mais próximo do que ocorreu. Para isso, podemos criar um evento customizado e fazer uso dele quando uma exceção for disparada.
Essa classe que representará o evento customizado herda diretamente da classe WebRequestErrorEvent e tem o nome de WebParametersRequestErrorEvent. Ao contrário dos eventos padrões que já estão embutidos no ASP.NET, os eventos customizados devem ser explicitamente disparados e, para poupar código, podemos criar um módulo. O módulo fornece a instancia da classe HttpApplication que nos permite interceptar o evento Error que, por sua vez, é disparado sempre quando um erro não tratado ocorre na aplicação. Com isso, basta simplesmente instanciar e invocar o método Raise do evento customizado.
Finalmente, apenas o que precisamos é configurar devidamente o Health Monitoring no arquivo Web.Config da aplicação, fazendo o mapeamento entre o eventMapping, rules e providers, como é mostrado detalhadamente através do código abaixo:
<system.web>
<healthMonitoring enabled=”true” heartbeatInterval=”0″>
<providers>
<add
name=”SimpleMailWebEventProvider”
type=”System.Web.Management.SimpleMailWebEventProvider”
from=”suporte@site.com.br”
to=”israel@site.com.br”
buffer=”false” />
</providers>
<rules>
<add
name=”WebParametersRequestErrorEventModule Mail”
eventName=”WebParametersRequestErrorEvent”
provider=”SimpleMailWebEventProvider”
profile=”Default”
minInstances=”1″
maxLimit=”Infinite”
minInterval=”00:00:00″/>
</rules>
<eventMappings>
<add
name=”WebParametersRequestErrorEvent”
type=”Logger.WebParametersRequestErrorEvent, Logger”/>
</eventMappings>
</healthMonitoring>
<httpModules>
<add
name=”WebParametersRequestErrorEventModule”
type=”Logger.WebParametersRequestErrorEventModule, Logger”/>
</httpModules>
<system.net>
Ao receber o e-mail, tenho todos os detalhes do erro que já era fornecido pelo evento WebRequestErrorEvent, e mais os dados contextuais da requisição:
Custom event details:
Request – QueryStrings
ID: 123
Nome: Israel Aece
E-mail: israel@projetando.net
Request – Forms
__VIEWSTATE: /wEPDwUJOTQ4N…m+ks3yA==
__EVENTVALIDATION: /wEWBALs0J+…ewcwK+BGBh
txtValor: 123,45
txtNome: Jack Bauer
Button1: Button
Download: WebParametersRequestErrorEvent.cs.txt (1.37 kb) e WebParametersRequestErrorEventModule.cs.txt (654.00 bytes)