Estou tentando usar o ELMAH para registrar erros no meu aplicativo ASP.NET MVC, no entanto, quando eu uso o atributo [HandleError] nos meus controladores, o ELMAH não registra nenhum erro quando eles ocorrem.
Como eu estou supondo que é porque o ELMAH registra apenas erros sem tratamento e o atributo [HandleError] está manipulando o erro, portanto, não há necessidade de registrá-lo.
Como modifico ou como modificaria o atributo para que o ELMAH saiba que houve um erro e o registre.
Edit: Deixe-me garantir que todos entendam, eu sei que posso modificar o atributo que não é a pergunta que estou fazendo ... O ELMAH é ignorado ao usar o atributo handleerror, o que significa que não verá que houve um erro porque foi tratado já pelo atributo ... O que estou perguntando é que existe uma maneira de fazer com que o ELMAH veja o erro e registre-o, mesmo que o atributo tenha manipulado ... Pesquisei e não vi nenhum método para ligar para forçá-lo a registrar o erro....
fonte
Respostas:
Você pode subclassificar
HandleErrorAttribute
e substituir seuOnException
membro (sem necessidade de copiar) para que ele registre a exceção no ELMAH e somente se a implementação básica lidar com isso. A quantidade mínima de código necessária é a seguinte:A implementação base é invocada primeiro, dando a chance de marcar a exceção como sendo manipulada. Somente então a exceção é sinalizada. O código acima é simples e pode causar problemas se usado em um ambiente onde o
HttpContext
pode não estar disponível, como teste. Como resultado, você desejará um código mais defensivo (ao custo de ser um pouco mais longo):Esta segunda versão tentará usar a sinalização de erro do ELMAH primeiro, que envolve o pipeline totalmente configurado, como registro, correspondência, filtragem e o que você possui. Caso contrário, ele tenta ver se o erro deve ser filtrado. Caso contrário, o erro é simplesmente registrado. Esta implementação não trata de notificações por email. Se a exceção puder ser sinalizada, um email será enviado se configurado para isso.
Talvez você também precise cuidar para que, se várias
HandleErrorAttribute
instâncias estiverem em vigor, o registro duplicado não ocorra, mas os dois exemplos acima devem começar.fonte
Desculpe, mas acho que a resposta aceita é um exagero. Tudo que você precisa fazer é o seguinte:
e registre-o (a ordem é importante) em Global.asax.cs:
fonte
HandleErrorAttribute
, não há necessidade de substituirOnException
onBaseController
. Suponhamos que a resposta seja aceita.new UnhandledLoggedException(Exception thrown)
que acrescenta algo aoMessage
antes de devolvê-lo.ElmahHandledErrorLoggerFilter()
apenas registrando erros não tratados, mas não tratados. Registrei os filtros na ordem correta, como você mencionou, alguma opinião?Agora existe um pacote ELMAH.MVC no NuGet que inclui uma solução aprimorada da Atif e também um controlador que lida com a interface elmah no roteamento MVC (não é mais necessário usar esse axd). A melhor solução IMHO é criar um filtro que atue no final de todos os outros filtros e registre os eventos que já foram manipulados. O módulo elmah deve cuidar de registrar os outros erros que não são tratados pelo aplicativo. Isso também permitirá que você use o monitor de integridade e todos os outros módulos que podem ser adicionados ao asp.net para examinar eventos de erro
O problema com essa solução (e com todas as aqui) ) é que, de uma maneira ou de outra, o manipulador de erros elmah está realmente lidando com o erro, ignorando o que você pode querer configurar como uma tag customError ou através do ErrorHandler ou seu próprio manipulador de erros
Eu escrevi isso olhando com refletor no ErrorHandler dentro de elmah.mvc
Agora, na sua configuração de filtro, você deseja fazer algo assim:
Observe que deixei um comentário lá para lembrar às pessoas que, se elas quiserem adicionar um filtro global que realmente manipulará a exceção, ela deve ocorrer ANTES deste último filtro; caso contrário, você encontrará o caso em que a exceção não tratada será ignorada pelo ElmahMVCErrorFilter porque ele não foi tratado e deve ser registrado pelo módulo Elmah, mas o próximo filtro marca a exceção como manipulada e o módulo a ignora, resultando na exceção que nunca a transforma em elmah.
Agora, verifique se as configurações de aplicativos para elmah no seu webconfig são parecidas com esta:
O importante aqui é "elmah.mvc.disableHandleErrorFilter", se isso for falso, ele usará o manipulador dentro de elmah.mvc que realmente tratará a exceção usando o HandleErrorHandler padrão que ignorará suas configurações de customError
Essa configuração permite que você defina suas próprias tags ErrorHandler em classes e visualizações, enquanto ainda registra esses erros através do ElmahMVCErrorFilter, adicionando uma configuração customError ao seu web.config através do módulo elmah, até mesmo escrevendo seus próprios manipuladores de erros. A única coisa que você precisa fazer é lembrar de não adicionar nenhum filtro que realmente lide com o erro antes do filtro elmah que escrevemos. E eu esqueci de mencionar: não há duplicatas no elmah.
fonte
Você pode levar o código acima e ir um passo além, introduzindo uma fábrica de controladores personalizados que injeta o atributo HandleErrorWithElmah em cada controlador.
Para mais informações, confira minha série de blogs sobre como fazer login no MVC. O primeiro artigo aborda a instalação e execução do Elmah para o MVC.
Há um link para código para download no final do artigo. Espero que ajude.
http://dotnetdarren.wordpress.com/
fonte
Eu sou novo no asp.net MVC. Enfrentei o mesmo problema, o seguinte é viável em meu Erorr.vbhtml (funcionará se você precisar registrar apenas o erro usando o Elmah log)
É simplesmente!
fonte
Uma solução completamente alternativa é não usar o MVC
HandleErrorAttribute
e confiar no tratamento de erros do ASP.Net, com o qual o Elmah foi projetado para trabalhar.Você precisa remover o global padrão
HandleErrorAttribute
de App_Start \ FilterConfig (ou Global.asax) e configurar uma página de erro no seu Web.config:Observe que esse pode ser um URL roteado do MVC; portanto, o acima será redirecionado para a
ErrorController.Index
ação quando ocorrer um erro.fonte
Para mim, era muito importante fazer o log de email funcionar. Depois de algum tempo, descobri que isso precisa de apenas 2 linhas de código a mais no exemplo do Atif.
Espero que isso ajude alguém :)
fonte
Isso é exatamente o que eu precisava para a configuração do meu site MVC!
Adicionei uma pequena modificação ao
OnException
método para lidar com váriasHandleErrorAttribute
instâncias, conforme sugerido por Atif Aziz:Simplesmente
context.ExceptionHandled
checo antes de chamar a classe base, apenas para saber se alguém manipulou a exceção antes do manipulador atual.Funciona para mim e eu publico o código caso alguém precise dele e pergunte se alguém sabe se eu esqueci alguma coisa.
Espero que seja útil:
fonte