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 da 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. Nell'ASP tradizionale vengono gestiti gli errori con On Error Resume Next (o try-catch blocchi in JScript). In alternativa, se si esegue Internet Information Services (IIS), usare l'oggetto ASPError per creare una pagina di segnalazione errori personalizzata. Tuttavia, questi approcci presentano i loro limiti.

ASP.NET fornisce 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 segnalazione degli 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 le informazioni sugli errori (come nel codice di esempio da seguire) oppure registrare l'evento o eseguire altre azioni.

Nota

In questo esempio vengono visualizzate informazioni dettagliate sugli errori 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 l'utente che si è verificato un errore e quindi registrare effettivamente i dettagli specifici degli errori 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 testerà l'evento Page_Error .

  1. Seguire questa procedura per aggiungere un nuovo file denominato PageEvent.aspx al progetto:

    1. Aprire Visual Studio .NET.
    2. In Esplora soluzioni fare clic con il pulsante destro del mouse sul nodo del progetto, scegliere Aggiungi e quindi fare clic su Aggiungi web form.
    3. Nella casella di testo Nome digitare PageEvent.aspx e quindi fare clic su Apri.
  2. 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>
    
  3. Scegliere SalvaPageEvent.aspx dal menu File.

  4. 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.

Nota

È possibile notare che il codice invia una chiamata a Server.ClearError. In questo modo si impedisce che l'errore continui fino all'evento Application_Error da gestire.

Usare l'evento Application_Error

Analogamente all'evento Page_Error , è possibile usare l'evento Application_Error per intercettare gli errori che si verificano nell'applicazione. A causa dell'ambito a livello di applicazione dell'evento, è possibile registrare le informazioni sugli errori dell'applicazione o gestire altri errori a livello di applicazione che possono verificarsi.

L'esempio da seguire è basato 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 :

  1. Aggiungere un nuovo file denominato AppEvent.aspx al progetto.

  2. 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>
    
  3. Scegliere SalvaAppEvent.aspx dal menu File.

  4. Aggiungere l'evento Application_Error al file Global.asax per intercettare l'errore generato nell'evento Page_Load della pagina AppEvent.aspx . Si noti che è necessario aggiungere un'istruzione Imports per lo System.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
    
  5. Salvare il file Global.asax .

  6. In Visual Studio .NET scegliere Compila dal menu Compila.

  7. 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 è stata aggiunta una nuova voce nel registro eventi. Questo esempio crea una voce nel registro applicazioni, accessibile dalla Visualizzatore eventi. Dopo la registrazione dell'errore, è possibile reindirizzare l'utente a un'altra pagina di errore più semplice o eseguire altre azioni, se necessario.

Usare il file Web.config

Se non si chiama Server.ClearError o si intercetta 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 pagina specifica in base al codice di errore HTTP (Hypertext Transfer Protocol) generato. È possibile utilizzare questo metodo per personalizzare il messaggio di errore ricevuto dall'utente.

Se si verifica un errore che non è intrappolato in uno dei livelli precedenti dell'applicazione, viene visualizzata questa pagina personalizzata. Questa sezione illustra 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.

  1. Aprire il file Global.asax dall'esempio precedente.

  2. Impostare come commento la Server.ClearError riga per assicurarsi che l'errore venga visualizzato nel file Web.config .

  3. 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
    
  4. 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>
    

    Nota

    È necessario modificare il percorso del file nell'attributo in defaultRedirect modo che faccia riferimento ai nomi di applicazioni e server Web pertinenti.

  5. 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 questo esempio usa 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>
    
  6. 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>
    

Nota

La pagina specificata nella defaultRedirect<customErrors> sezione è un file .htm . Se si intende usare GetLastError in una pagina di .aspx (come fanno gli 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 la modalità di reindirizzamento degli errori. Ad esempio, se si sviluppa l'applicazione, è molto probabile che si desideri visualizzare i messaggi di errore ASP.NET effettivi 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 specificata defaultRedirect . Questo mode viene usato principalmente nella produzione.

  • Off: gli utenti ricevono le informazioni sull'eccezione e non vengono reindirizzati alla defaultRedirect pagina. Questo mode viene usato principalmente nello sviluppo.

  • RemoteOnly: solo gli utenti che accedono al sito nel computer locale (usando localhost) ricevono le informazioni sull'eccezione. Tutti gli altri utenti vengono reindirizzati alla defaultRedirect 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 account amministrativo potente 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 & procedure

Riferimenti