Skapa anpassade felrapporteringssidor i ASP.NET med hjälp av Visual Basic .NET

Den här artikeln beskriver hur du använder Microsoft Visual Basic .NET-kod för att fånga och svara på fel när de inträffar i ASP.NET.

Ursprunglig produktversion: Visual Basic .NET, ASP.NET
Ursprungligt KB-nummer: 308132

Sammanfattning

ASP.NET har förbättrat alternativen för felhantering från traditionella Active Server Pages (ASP). I ASP.NET kan du hantera fel på flera olika nivåer i dina program.

Nya funktioner i ASP.NET

ASP.NET erbjuder flera framsteg i hur du kan hantera och svara på fel. I traditionell ASP hanterar du fel med On Error Resume Next (eller try-catch block i JScript). Om du kör IIS (Internet Information Services) kan du också använda ASPError objektet för att skapa en anpassad felrapporteringssida. Dessa metoder har dock sina begränsningar.

ASP.NET innehåller flera nivåer där du kan hantera och svara på fel som kan uppstå när du kör ett ASP.NET program. ASP.NET innehåller tre huvudsakliga metoder som gör att du kan fånga och svara på fel när de inträffar: Page_Error händelsen, Application_Error händelsen och programkonfigurationsfilen (Web.config).

Den här artikeln visar hur du använder dessa nya funktioner i ditt ASP.NET program. Även om den här artikeln beskriver hur du tillhandahåller anpassade felsidor och allmän felrapportering som direkt relaterar till ASP.NET, beskriver den här artikeln inte andra metoder för felhantering, till exempel blockering try-catch-finally och CLR-undantagssystemet (Common Language Runtime).

Använda händelsen Page_Error

Händelsen Page_Error ger ett sätt att fånga fel som inträffar på sidnivå. Du kan visa felinformation (som exempelkoden som ska följas gör), eller så kan du logga händelsen eller utföra någon annan åtgärd.

Kommentar

I det här exemplet visas detaljerad felinformation i webbläsaren endast i demonstrationssyfte. Du bör vara försiktig när du visar detaljerad information för slutanvändaren av programmet, särskilt när programmet körs på Internet. En lämpligare åtgärd är att visa ett meddelande till användaren som meddelar dem om att ett fel har inträffat och sedan faktiskt logga den specifika felinformationen i händelseloggen.

Det här exemplet utlöser ett null-undantag som tvingar ett fel att inträffa i händelsen Page_Load . Följ de här stegen för att skapa den första sidan som testar Page_Error händelsen.

  1. Följ de här stegen för att lägga till en ny fil med namnet PageEvent.aspx i projektet:

    1. Öppna Visual Studio .NET.
    2. Högerklicka på projektnoden i Solution Explorer, peka på Lägg till och klicka sedan på Lägg till webbformulär.
    3. I textrutan Namn skriver du PageEvent.aspx och klickar sedan på Öppna.
  2. Lägg till följande kod i 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. På Arkiv-menyn klickar du på Spara PageEvent.aspx.

  4. Högerklicka på sidan och klicka sedan på Visa i webbläsare för att köra sidan. Observera att felet genereras och rapporteras enligt kodspecifikationerna.

Kommentar

Du kanske märker att koden utfärdar ett anrop till Server.ClearError. Detta förhindrar att felet fortsätter till den händelse som Application_Error ska hanteras.

Använda händelsen Application_Error

På samma Page_Error sätt som händelsen kan du använda Application_Error händelsen för att trapa fel som inträffar i ditt program. På grund av händelsens programomfattande omfång kan du logga information om programfel eller hantera andra fel på programnivå som kan inträffa.

Exemplet som ska följas baseras på det föregående Page_Error händelsekodexemplet och utlöses om felet i Page_Load händelsen inte fångades i händelsen Page_Error . Händelsen Application_Error anges i filen Global.asax i ditt program. För enkelhetens skull skapar stegen i det här avsnittet en ny sida där du kan utlösa undantaget, trapa felet i Application_Error händelse av filen Global.asax och skriva felet till händelseloggen. Följande steg visar hur du använder händelsen Application_Error :

  1. Lägg till en ny fil med namnet AppEvent.aspx i projektet.

  2. Lägg till följande kod i AppEvent.aspx:

    <script language=vb runat="server">
         Sub Page_Load(Sender as object, e as EventArgs)
             throw(new ArgumentNullException())
         End Sub
    </script>
    
  3. Klicka på Spara AppEvent.aspxArkiv-menyn.

  4. Application_Error Lägg till händelsen i filen Global.asax för att fånga det fel som du genererar i Page_Load händelse av AppEvent.aspx sidan. Observera att du måste lägga till en Imports -instruktion för System.Diagnostics namnområdet i Global.asax för att kunna använda händelseloggen.

    Lägg till följande kod i filen 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. Spara filen Global.asax.

  6. I Visual Studio .NET går du till menyn Skapa och klickar på Skapa.

  7. Högerklicka på sidan och klicka sedan på Visa i webbläsare. I det här fallet är sidan tom, men du bör märka att en ny post har lagts till i händelseloggen. Det här exemplet gör en post i programloggen, som är tillgänglig från Loggboken. När du har loggat felet kanske du vill omdirigera användaren till en annan mer användarvänlig felsida eller utföra några ytterligare åtgärder om det behövs.

Använda filen Web.config

Om du inte anropar Server.ClearError eller sväller felet i Page_Error händelsen eller Application_Error hanteras felet baserat på inställningarna i avsnittet i <customErrors> filen Web.config. I avsnittet <customErrors> kan du ange en omdirigeringssida som en standardfelsida (defaultRedirect) eller ange till en viss sida baserat på felkoden Hypertext Transfer Protocol (HTTP) som genereras. Du kan använda den här metoden för att anpassa felmeddelandet som användaren tar emot.

Om ett fel uppstår som inte har fastnat på någon av de tidigare nivåerna i ditt program visas den här anpassade sidan. Det här avsnittet visar hur du ändrar filen Global.asax så att den Server.ClearError aldrig anropas. Därför hanteras felet i web.config-filen som den sista punkten för att fånga felet.

  1. Öppna filen Global.asax från föregående exempel.

  2. Kommentera ut Server.ClearError raden för att säkerställa att felet visas i web.config-filen .

  3. Spara ändringarna i Global.asax. Koden bör nu se ut ungefär så här:

     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. Lägg till följande kod i <customErrors> avsnittet för att omdirigera användaren till en anpassad sida:

    <customErrors defaultRedirect="http://hostName/applicationName/errorStatus.htm" mode="On">
    </customErrors>
    

    Kommentar

    Du måste ändra filsökvägen i defaultRedirect attributet så att den refererar till relevanta webbserver- och programnamn.

  5. Eftersom felen som är fångade på den här nivån skickas till en standardfelsida måste du skapa en felsida med namnet ErrorStatus.htm. Tänk på att du använder den här metoden för att styra vad som visas för användaren, så i det här exemplet används en .htm sida för felsidan. Lägg till följande kod i 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. Om du vill testa koden sparar du filerna, skapar projektet och visar sedan AppEvent.aspx i webbläsaren. Observera att när felet utlöses omdirigeras du till sidan ErrorStatus.htm . Även om du kan referera till en standardfelsida i värdet defaultRedirect för attributet i <customErrors> avsnittet, kan du också ange en viss sida att omdirigera till baserat på DEN HTTP-felkod som genereras. Det <error> underordnade elementet tillåter det här alternativet. Till exempel:

    <customErrors defaultRedirect="http://hostName/applicationName/errorStatus.htm" mode="On">
        <error statusCode="404" redirect="filenotfound.htm"/>
    </customErrors>
    

Kommentar

Sidan som anges i defaultRedirect avsnittet <customErrors> är en .htm fil. Om du tänker använda GetLastError på en .aspx sida (vilket exemplen Page_Error och Application_Error gör) måste du lagra undantaget i en sessionsvariabel eller någon annan metod innan omdirigeringen sker.

Observera att avsnittet <customErrors> innehåller ett mode attribut som är inställt på On . Attributet mode används för att styra hur felomdirigeringen sker. Om du till exempel utvecklar programmet vill du förmodligen se de faktiska ASP.NET felmeddelandena och inte vill omdirigeras till den mer användarvänliga felsidan. Attributet mode innehåller följande inställningar:

  • On: Ohanterade undantag omdirigerar användaren till den angivna defaultRedirect sidan. Detta mode används främst i produktion.

  • Off: Användarna får undantagsinformationen och omdirigeras inte till sidan defaultRedirect . Detta mode används främst under utveckling.

  • RemoteOnly: Endast användare som har åtkomst till webbplatsen på den lokala datorn (med hjälp av localhost) får undantagsinformationen. Alla andra användare omdirigeras till sidan defaultRedirect . Det här läget används främst för felsökning.

Felsökning

I standardinstallationen i Windows kör ASP.NET webbprogramkod i en arbetsprocess. Identiteten för den här processen är som standard ett lokalt konto som inte är privilegierat och som kallas ASPNET-kontot . I betaversioner av ASP.NET var processidentiteten System, ett kraftfullt administrativt konto med många privilegier på datorn.

I sin standardinstallation på Windows Server (IIS) kör ASP.NET webbprogramkod i en arbetsprocess. Identiteten för den här processen är som standard ett begränsat konto med namnet NetworkService.

Mer information om den här ändringen och hur den kan påverka körningen av koden i den här artikeln samt annan kod som kan behöva ytterligare åtkomsträttigheter finns i mönster och metoder

Referenser