Creare pagine di segnalazione errori personalizzate in ASP.NET usando Visual Basic .NET
Questo articolo descrive come usare il codice .NET di Microsoft Visual Basic per intercettare e rispondere agli errori quando si verificano in ASP.NET.
Versione originale del prodotto: Visual Basic .NET, ASP.NET
Numero KB originale: 308132
Riepilogo
ASP.NET ha migliorato le opzioni di gestione degli errori dalle pagine ASP (Active Server Pages) tradizionali. In ASP.NET è possibile gestire gli errori a diversi livelli nelle applicazioni.
Nuove funzionalità in ASP.NET
ASP.NET offre diversi progressi nel modo in cui è possibile gestire e rispondere agli errori. In ASP tradizionale si gestiscono gli errori con On Error Resume Next
(o try-catch
blocchi in JScript). In alternativa, se si esegue Internet Information Services (IIS), utilizzare l'oggetto ASPError
per creare una pagina di segnalazione errori personalizzata. Tuttavia, questi approcci presentano le loro limitazioni.
ASP.NET offre diversi livelli in cui è possibile gestire e rispondere agli errori che possono verificarsi quando si esegue un'applicazione ASP.NET. ASP.NET fornisce tre metodi principali che consentono di intercettare e rispondere agli errori quando si verificano: l'evento Page_Error
, l'evento Application_Error
e il file di configurazione dell'applicazione (Web.config).
Questo articolo illustra come usare queste nuove funzionalità nell'applicazione ASP.NET. Anche se questo articolo descrive come fornire pagine di errore personalizzate e segnalazioni di errori generali in relazione direttamente a ASP.NET, questo articolo non descrive altri approcci di gestione degli errori, ad esempio il try-catch-finally
blocco e il sistema di eccezioni CLR (Common Language Runtime).
Usare l'evento Page_Error
L'evento Page_Error
consente di intercettare gli errori che si verificano a livello di pagina. È possibile visualizzare informazioni sull'errore (come il codice di esempio da seguire) oppure registrare l'evento o eseguire un'altra azione.
Note
In questo esempio vengono visualizzate informazioni dettagliate sull'errore nel browser solo a scopo dimostrativo. È consigliabile prestare attenzione quando si visualizzano informazioni dettagliate all'utente finale dell'applicazione, soprattutto quando l'applicazione è in esecuzione su Internet. Un'azione più appropriata sarebbe quella di visualizzare un messaggio all'utente che informa che si è verificato un errore e quindi registrare effettivamente i dettagli specifici dell'errore nel registro eventi.
In questo esempio viene generata un'eccezione Null, che forza l'esecuzione di un errore nell'evento Page_Load
. Seguire questa procedura per creare la pagina iniziale che verificherà l'evento Page_Error
.
Seguire questa procedura per aggiungere un nuovo file denominato PageEvent.aspx al progetto:
- Aprire Visual Studio .NET.
- In Esplora soluzioni fare clic con il pulsante destro del mouse sul nodo del progetto, scegliere Aggiungi e quindi fare clic su Aggiungi Modulo Web.
- Nella casella di testo Nome digitare PageEvent.aspx e quindi fare clic su Apri.
Aggiungere il codice seguente a PageEvent.aspx:
<%@ Page Language="vb"%> <script runat=server> Sub Page_Load(Sender as object, e as EventArgs) throw(new System.ArgumentNullException()) End Sub Sub Page_Error(Sender as object, e as EventArgs) Dim objErr as Exception = Server.GetLastError().GetBaseException() Dim err as String = "<b>Error Caught in Page_Error event</b><hr><br>" & _ "<br><b>Error in: </b>" & Request.Url.ToString() & _ "<br><b>Error Message: </b>" & objErr.Message.ToString() & _ "<br><b>Stack Trace:</b><br>" & _objErr.StackTrace.ToString() Response.Write(err.ToString()) Server.ClearError() End Sub </script>
Scegliere Salva PageEvent.aspx dal menu File.
Fare clic con il pulsante destro del mouse sulla pagina e quindi scegliere Visualizza nel browser per eseguire la pagina. Si noti che l'errore viene generato e segnalato in base alle specifiche del codice.
Note
È possibile notare che il codice genera una chiamata a Server.ClearError
. In questo modo si impedisce che l'errore continui con l'evento Application_Error
da gestire.
Usare l'evento Application_Error
Analogamente all'evento, è possibile usare l'evento Page_Error
Application_Error
per intercettare gli errori che si verificano nell'applicazione. A causa dell'ambito a livello di applicazione dell'evento, è possibile registrare informazioni sull'errore dell'applicazione o gestire altri errori a livello di applicazione che possono verificarsi.
L'esempio da seguire si basa sull'esempio di codice dell'evento precedente Page_Error
e viene generato se l'errore nell'evento Page_Load
non è stato intrappolato nell'evento Page_Error
. L'evento Application_Error
viene specificato nel file Global.asax dell'applicazione. Per semplicità, i passaggi di questa sezione creano una nuova pagina in cui generare l'eccezione, intercettare l'errore in Application_Error
caso di file Global.asax e scrivere l'errore nel registro eventi. I passaggi seguenti illustrano come usare l'evento Application_Error
:
Aggiungere un nuovo file denominato AppEvent.aspx al progetto.
Aggiungere il codice seguente a AppEvent.aspx:
<script language=vb runat="server"> Sub Page_Load(Sender as object, e as EventArgs) throw(new ArgumentNullException()) End Sub </script>
Scegliere Salva AppEvent.aspx dal menu File.
Aggiungere l'evento
Application_Error
al file Global.asax per intercettare l'errorePage_Load
generato in caso di pagina AppEvent.aspx . Si noti che è necessario aggiungere un'istruzioneImports
per loSystem.Diagnostics
spazio dei nomi a Global.asax per usare il registro eventi.Aggiungere il codice seguente al file Global.asax :
Imports System.Diagnostics Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs) Dim objErr As Exception = Server.GetLastError().GetBaseException() Dim err As String = "Error Caught in Application_Error event" & _ System.Environment.NewLine & _ "Error in: " & Request.Url.ToString() & _ System.Environment.NewLine & _ "Error Message: " & objErr.Message.ToString() & _ System.Environment.NewLine & _ "Stack Trace:" & objErr.StackTrace.ToString() EventLog.WriteEntry("Sample_WebApp", err, EventLogEntryType.Error) Server.ClearError() additional actions... End Sub
Salvare il file Global.asax .
In Visual Studio .NET scegliere Compila dal menu Compila.
Fare clic con il pulsante destro del mouse sulla pagina e quindi scegliere Visualizza nel browser. In questo caso la pagina sarà vuota, tuttavia, si noterà che nel registro eventi è stata aggiunta una nuova voce. In questo esempio viene visualizzata una voce nel registro applicazioni, accessibile dal Visualizzatore eventi. Dopo aver eseguito la registrazione dell'errore, è possibile reindirizzare l'utente a un'altra pagina di errore più intuitiva oppure eseguire alcune azioni aggiuntive, se necessario.
Usare il file Web.config
Se non si chiama Server.ClearError
o si intercettare l'errore nell'evento Page_Error
o Application_Error
, l'errore viene gestito in base alle impostazioni nella <customErrors>
sezione del file Web.config . <customErrors>
Nella sezione è possibile specificare una pagina di reindirizzamento come pagina di errore predefinita (defaultRedirect
) o specificare una determinata pagina in base al codice di errore HTTP (Hypertext Transfer Protocol) generato. È possibile usare questo metodo per personalizzare il messaggio di errore ricevuto dall'utente.
Se si verifica un errore che non è intrappolato a uno dei livelli precedenti dell'applicazione, viene visualizzata questa pagina personalizzata. In questa sezione viene illustrato come modificare il file Global.asax in modo che Server.ClearError
non venga mai chiamato. Di conseguenza, l'errore viene gestito nel file Web.config come ultimo punto per intercettare l'errore.
Aprire il file Global.asax dell'esempio precedente.
Impostare come commento la
Server.ClearError
riga per assicurarsi che l'errore venga visualizzato nel file Web.config .Salvare le modifiche apportate a Global.asax. Il codice dovrebbe ora essere simile al seguente:
Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs) Dim objErr As Exception = Server.GetLastError().GetBaseException() Dim err As String = "Error Caught in Application_Error event" & _ System.Environment.NewLine & _ "Error in: " & Request.Url.ToString() & _ System.Environment.NewLine & _ "Error Message: " & objErr.Message.ToString() & _ System.Environment.NewLine & _ "Stack Trace:" & objErr.StackTrace.ToString() EventLog.WriteEntry("Sample_WebApp", err, EventLogEntryType.Error) Server.ClearError() additional actions... End Sub
Aggiungere il codice seguente alla
<customErrors>
sezione per reindirizzare l'utente a una pagina personalizzata:<customErrors defaultRedirect="http://hostName/applicationName/errorStatus.htm" mode="On"> </customErrors>
Note
È necessario modificare il percorso del file nell'attributo in
defaultRedirect
modo che faccia riferimento ai nomi di applicazioni e server Web pertinenti.Poiché gli errori intrappolati a questo livello vengono inviati a una pagina di errore predefinita, è necessario creare una pagina di errore denominata ErrorStatus.htm. Tenere presente che si usa questo metodo per controllare ciò che viene presentato all'utente, quindi in questo esempio viene usata una pagina .htm per la pagina di errore. Aggiungere il codice seguente a ErrorStatus.htm:
<HTML> <HEAD> <TITLE></TITLE> <META NAME="GENERATOR" Content="Microsoft Visual Studio 7.0"> </HEAD> <BODY> <b>Custom Error page!</b> <br> You have been redirected here from the <customErrors> section of the Web.config file. </BODY> </HTML>
Per testare il codice, salvare i file, compilare il progetto e quindi visualizzare AppEvent.aspx nel browser. Si noti che quando viene generato l'errore, si viene reindirizzati alla pagina ErrorStatus.htm . Sebbene sia possibile fare riferimento a una pagina di errore predefinita nel valore dell'attributo
defaultRedirect
nella<customErrors>
sezione , è anche possibile specificare una pagina specifica a cui reindirizzare in base al codice di errore HTTP generato. L'elemento<error>
figlio consente questa opzione. Ad esempio:<customErrors defaultRedirect="http://hostName/applicationName/errorStatus.htm" mode="On"> <error statusCode="404" redirect="filenotfound.htm"/> </customErrors>
Note
La pagina specificata nella defaultRedirect
<customErrors>
sezione è un file .htm . Se si prevede di usare GetLastError
in una pagina di .aspx (operazione eseguita dagli Page_Error
esempi e Application_Error
), è necessario archiviare l'eccezione in una variabile di sessione o in un altro approccio prima che venga eseguito il reindirizzamento.
Si noti che la <customErrors>
sezione include un mode
attributo impostato su On
. L'attributo mode
viene usato per controllare il modo in cui si verifica il reindirizzamento degli errori. Ad esempio, se si sviluppa l'applicazione, è probabile che si voglia visualizzare i messaggi di errore effettivi ASP.NET e non si vuole essere reindirizzati alla pagina di errore più intuitiva. L'attributo mode
include le impostazioni seguenti:
On
: le eccezioni non gestite reindirizzano l'utente alla pagina specificatadefaultRedirect
. Questomode
viene usato principalmente nell'ambiente di produzione.Off
: gli utenti ricevono le informazioni sull'eccezione e non vengono reindirizzati alladefaultRedirect
pagina. Questomode
viene usato principalmente nello sviluppo.RemoteOnly
: solo gli utenti che accedono al sito nel computer locale (tramite localhost) ricevono le informazioni sull'eccezione. Tutti gli altri utenti vengono reindirizzati alladefaultRedirect
pagina. Questa modalità viene usata principalmente per il debug.
Risoluzione dei problemi
Nell'installazione predefinita in Windows ASP.NET esegue il codice dell'applicazione Web in un processo di lavoro. Per impostazione predefinita, l'identità di questo processo è un account locale senza privilegi denominato account ASPNET . Nelle versioni beta di ASP.NET, l'identità del processo era System, un potente account amministrativo con molti privilegi nel computer.
Nell'installazione predefinita in Windows Server (IIS), ASP.NET esegue il codice dell'applicazione Web in un processo di lavoro. Per impostazione predefinita, l'identità di questo processo è un account limitato denominato NetworkService.
Per altre informazioni su questa modifica e su come può influire sull'esecuzione del codice in questo articolo, nonché su altro codice che potrebbe richiedere diritti di accesso aggiuntivi, vedere modelli e procedure