2009-05-01 14 views
7

Ecco quello che sto cercando di fare nel mio Global.asax.vb:Come posso registrare eccezioni non gestite in ASP.NET MVC?

Public Class MvcApplication 
    Inherits System.Web.HttpApplication 

    Shared Sub RegisterRoutes(ByVal routes As RouteCollection) 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}") 
     routes.MapRoute(_ 
      "Error", _ 
      "error.html", _ 
      New With {.controller = "Error", _ 
         .action = "FriendlyError"} _ 
     ) 
     ... 
     'other routes go here' 
     ... 
    End Sub 

    Sub Application_Start() 
     RegisterRoutes(RouteTable.Routes) 
    End Sub 

    Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs) 
     ... 
     'code here logs the unhandled exception and sends an email alert' 
     ... 
     Server.Transfer("http://www.example.com/error.html") 
    End Sub 

End Class 

Ma che Server.Transfer fallisce:

Invalid path for child request 'http://www.example.com/error.html'. A virtual path is expected.

Come posso risolvere questo ? Oppure, qual è il modo migliore per me di farlo?

risposta

9

ho appena trovato questo sul blog di Scott Hanselman here chiamato ELMAH che è un errore Logger/Handler che è possibile utilizzare senza dover cambiare il tuo codice. Potresti volerlo esaminare, poiché sembra funzionare bene con MVC.

+7

Qui usiamo una versione modificata di ELMAH su Stack Overflow: è molto buona. –

+2

@ Jarrod - Quali tipi di cose avete incluso nella forcella? –

+0

Regole ELMAH: è più utile di log4net. A PARER MIO. – MikeJ

2

Devi specifiy un percorso virtuale, vale a dire un percorso relativo alla base dell'applicazione (cioè nessun percorsi esterni per l'applicazione), in modo da qualcosa come: Server.Transfer ("error.html") o Server. transfer ("/ error.html") o Server.Transfer ("~/error.html")

+0

"~/error.html": errore durante l'esecuzione della richiesta secondaria per /error.html. –

+0

"/error.html": errore durante l'esecuzione della richiesta secondaria per /error.html. –

+0

"error.html": errore durante l'esecuzione della richiesta figlio per error.html. –

3

ELMAH è un eccellente gestore di errori per la cattura di eccezioni non gestite. Si inserisce perfettamente nella tua applicazione web tramite HttpModules e ha varie opzioni per la notifica e la registrazione.

Caratteristiche:

  • SQL, XML, SQLite, Logging InMemory
  • -mail di notifica
  • RSS feed
  • dettagliata! la registrazione delle eccezioni
  • Facile integrazione
  • Errore Segnalazione - segnalare il gestore errori di un errore durante la "dieing bene" per l'utente

E FYI, utilizza i ELMAH, anche se una versione biforcuta. Questo è il miglior architectural explanation e setup tutorial

2

Per impostazione predefinita, le applicazioni ASP.NET MVC hanno una vista condiviso/Error.aspx, eredita da

System.Web.Mvc.ViewPage<System.Web.Mvc.HandleErrorInfo> 

Se il controller utilizza l'attributo [HandleError], tutte le eccezioni sarà continua a fare bolle finché non vengono catturati e finiranno in quella pagina.

ho semplicemente aggiunto un Page_Load in linea (valido in questo caso, dal momento che è la fine della linea):

<script runat="server"> 
    Sub Page_Load(ByVal Sender As System.Object, ByVal e As System.EventArgs) 
    MyExceptionHandlerService.LogException("exceptionsource", this.Model.Exception) 
    End Sub 
</script> 

Dopo che, il "Mi dispiace ..." messaggio amichevole. Sembra che ELMAH sia più robusto, ma per le mie esigenze questo era sufficiente.

Problemi correlati