Usando IHttpModule Ao longo Global.asax
-
03-07-2019 - |
Pergunta
Eu tenho dado a tarefa emocionante de re-escrever o nosso sistema de manipulação de exceção. Enquanto vou afirmar que lidar com exceções de um ponto de vista de toda a aplicação não é algo que queremos, normalmente é inevitável quando a nossa equipa são insuficientes para a enorme quantidade de trabalho que precisa empurrar para fora da porta, então, por favor, não flamejante do solução globalizado para manipulação de exceção aqui:)
Eu tive uma boa caça para ver o que existem soluções comuns. No momento em que usamos Global.asax com o evento Application_Error para fazer Server.GetLastError () que é colocado em estado de sessão, em seguida, um redirecionamento é chamado para outra página onde os dados da sessão é então recuperado e saída em um formato legível. O redirecionamento também pede um sproc que irá auditar cuidadosamente as informações de erro que é um)-e enviado para os desenvolvedores e b) vistos de uma página web visível somente por desenvolvedores.
A nova forma que eu vi de fazer as coisas é usando a interface IHttpModule usando uma classe em App_Code para fazer algo nesse sentido (essa é a minha rápida implementação)
Imports Microsoft.VisualBasic
Public Class ErrorModule : Implements IHttpModule
Public Sub Dispose() Implements System.Web.IHttpModule.Dispose
' Not used
End Sub
Public Sub Init(ByVal context As System.Web.HttpApplication) Implements System.Web.IHttpModule.Init
AddHandler context.Error, AddressOf context_Error
End Sub
Public Sub context_Error(ByVal sender As Object, ByVal e As EventArgs)
Dim ex As Exception = HttpContext.Current.Server.GetLastError
' do something with the error
' call the stored procedure
' redirect the user to the error page
HttpContext.Current.Server.ClearError()
HttpContext.Current.Response.Redirect("index.htm")
End Sub
End Class
A minha pergunta é, qual é o benefício desta solução sobre o uso de eventos Global.asax? Além disso, qual é a melhor maneira de entregar os dados para uma página de erro?
EDIT: O código acima funciona pelo caminho;)
EDIT: Além disso, como funciona o HttpModule nos bastidores? Será que apenas registrar o evento de erro para essa função específica no arranque da aplicação?
UPDATE:
Após muito mais investigação parece pegar os dados da sessão é muito, muito confuso quando se trata de usar interface de IHttpModule. Eu não acho que MS amadureceram HttpModule o suficiente para que possa ser utilizada no cenário particular -. Até que não haja eventos específicos para os dados da sessão que é muito perigoso para nós usar
Solução
Usando um módulo tem a vantagem de ser facilmente removível, tudo que você precisa fazer para desativá-lo é para removê-lo
Tanto quanto seus dados vai, tentar ir com Server.Transfer ou Server.RewritePath - que vai manter todos os dados atuais (incluindo o último erro do servidor)
.Se por algum motivo ele limpa o último erro, você pode salvar o erro para HttpContext.Items antes da transferência / reescrever e depois recuperá-lo mais tarde.
Editar: Em resposta a sua edição, um IHttpModule atribui a qualquer eventos apropriados nele de implementação IHttpModule.Init .
Outras dicas
HttpModule
faz basicamente a mesma coisa que Global.asax
. Ele foi projetado como um módulo mais reutilizáveis ??e auto-suficiente para o tratamento de eventos.