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

Foi útil?

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 na sua configuração.

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top