Condividi tramite


Gestione degli errori di ASP.NET

di Erik Reitan

Scaricare il progetto di esempio Wingtip Toys (C#) o scaricare e-book (PDF)

Questa serie di esercitazioni illustra le nozioni di base per la creazione di un'applicazione Web Forms ASP.NET usando ASP.NET 4.5 e Microsoft Visual Studio Express 2013 per Web. Per questa serie di esercitazioni è disponibile un progetto di Visual Studio 2013 con codice sorgente C#.

In questa esercitazione si modificherà l'applicazione di esempio Wingtip Toys per includere la gestione degli errori e la registrazione degli errori. La gestione degli errori consentirà all'applicazione di gestire correttamente gli errori e visualizzare i messaggi di errore di conseguenza. La registrazione degli errori consentirà di trovare e correggere gli errori che si sono verificati. Questa esercitazione si basa sull'esercitazione precedente "Routing URL" e fa parte della serie di esercitazioni di Wingtip Toys.

Contenuto dell'esercitazione:

  • Come aggiungere la gestione degli errori globali alla configurazione dell'applicazione.
  • Come aggiungere la gestione degli errori a livello di applicazione, pagina e codice.
  • Come registrare gli errori per una revisione successiva.
  • Come visualizzare i messaggi di errore che non compromettono la sicurezza.
  • Come implementare i moduli di registrazione degli errori e la registrazione degli errori (ELMAH).

Panoramica

ASP.NET le applicazioni devono essere in grado di gestire gli errori che si verificano durante l'esecuzione in modo coerente. ASP.NET usa Common Language Runtime (CLR), che consente di notificare alle applicazioni errori in modo uniforme. Quando si verifica un errore, viene generata un'eccezione. Un'eccezione è un errore, una condizione o un comportamento imprevisto rilevato da un'applicazione.

In .NET Framework, un'eccezione è un oggetto che eredita dalla classe System.Exception. Le eccezioni vengono generate dalle aree di codice in cui si è verificato un problema. L'eccezione viene passata allo stack di chiamate a una posizione in cui l'applicazione fornisce il codice per gestire l'eccezione. Se l'applicazione non gestisce l'eccezione, il browser viene costretto a visualizzare i dettagli dell'errore.

Come procedura consigliata, gestire gli errori a livello di codice in Try//CatchFinally blocchi all'interno del codice. Provare a posizionare questi blocchi in modo che l'utente possa correggere i problemi nel contesto in cui si verificano. Se i blocchi di gestione degli errori sono troppo lontani da dove si è verificato l'errore, diventa più difficile fornire agli utenti le informazioni necessarie per risolvere il problema.

Classe Exception

La classe Exception è la classe base da cui ereditano le eccezioni. La maggior parte degli oggetti eccezione sono istanze di alcune classi derivate della classe Exception, ad esempio la SystemException classe , la IndexOutOfRangeException classe o la ArgumentNullException classe . La classe Exception dispone di proprietà, ad esempio la StackTrace proprietà , la InnerException proprietà e la Message proprietà , che forniscono informazioni specifiche sull'errore che si è verificato.

Gerarchia di ereditarietà delle eccezioni

Il runtime ha un set di base di eccezioni che derivano dalla classe generata dal SystemException runtime quando viene rilevata un'eccezione. La maggior parte delle classi che ereditano dalla classe Exception, ad esempio la IndexOutOfRangeException classe e la ArgumentNullException classe , non implementano membri aggiuntivi. Di conseguenza, le informazioni più importanti per un'eccezione sono disponibili nella gerarchia delle eccezioni, nel nome dell'eccezione e nelle informazioni contenute nell'eccezione.

Gerarchia di gestione delle eccezioni

In un'applicazione Web Forms ASP.NET le eccezioni possono essere gestite in base a una gerarchia di gestione specifica. È possibile gestire un'eccezione ai livelli seguenti:

  • Livello applicazione
  • Livello pagina
  • Livello di codice

Quando un'applicazione gestisce le eccezioni, è spesso possibile recuperare e visualizzare informazioni aggiuntive sull'eccezione ereditata dalla classe Exception. Oltre all'applicazione, alla pagina e al livello di codice, è anche possibile gestire le eccezioni a livello di modulo HTTP e usando un gestore personalizzato IIS.

Gestione degli errori a livello di applicazione

È possibile gestire gli errori predefiniti a livello di applicazione modificando la configurazione dell'applicazione o aggiungendo un Application_Error gestore nel file Global.asax dell'applicazione.

È possibile gestire gli errori predefiniti e gli errori HTTP aggiungendo una customErrors sezione al file diWeb.config . La customErrors sezione consente di specificare una pagina predefinita a cui gli utenti verranno reindirizzati quando si verifica un errore. Consente inoltre di specificare singole pagine per errori specifici del codice di stato.

<configuration>
  <system.web>
    <customErrors mode="On" defaultRedirect="ErrorPage.aspx?handler=customErrors%20section%20-%20Web.config">
      <error statusCode="404" redirect="ErrorPage.aspx?msg=404&amp;handler=customErrors%20section%20-%20Web.config"/>
    </customErrors>
  </system.web>
</configuration>

Sfortunatamente, quando si usa la configurazione per reindirizzare l'utente a una pagina diversa, non sono presenti i dettagli dell'errore che si è verificato.

È tuttavia possibile intercettare gli errori che si verificano in qualsiasi punto dell'applicazione aggiungendo codice al Application_Error gestore nel file Global.asax .

void Application_Error(object sender, EventArgs e)
{
    Exception exc = Server.GetLastError();

    if (exc is HttpUnhandledException)
    {
        // Pass the error on to the error page.
        Server.Transfer("ErrorPage.aspx?handler=Application_Error%20-%20Global.asax", true);
    }
}

Gestione degli eventi di errore a livello di pagina

Un gestore a livello di pagina restituisce l'utente alla pagina in cui si è verificato l'errore, ma poiché le istanze dei controlli non vengono mantenute, nella pagina non saranno più presenti elementi. Per fornire i dettagli dell'errore all'utente dell'applicazione, è necessario scrivere in modo specifico i dettagli dell'errore nella pagina.

In genere si usa un gestore errori a livello di pagina per registrare errori non gestiti o per portare l'utente a una pagina in grado di visualizzare informazioni utili.

Questo esempio di codice mostra un gestore per l'evento Error in una pagina Web ASP.NET. Questo gestore rileva tutte le eccezioni che non sono già gestite all'interno try/catch di blocchi nella pagina.

private void Page_Error(object sender, EventArgs e)
{
    Exception exc = Server.GetLastError();

    // Handle specific exception.
    if (exc is HttpUnhandledException)
    {
        ErrorMsgTextBox.Text = "An error occurred on this page. Please verify your " +                  
        "information to resolve the issue."
    }
    // Clear the error from the server.
    Server.ClearError();
}

Dopo aver gestito un errore, è necessario cancellarlo chiamando il ClearError metodo dell'oggetto Server (HttpServerUtility classe ), altrimenti verrà visualizzato un errore che si è verificato in precedenza.

Gestione degli errori a livello di codice

L'istruzione try-catch è costituita da un blocco try seguito da una o più clausole catch, che specificano gestori per eccezioni diverse. Quando viene generata un'eccezione, Common Language Runtime (CLR) cerca l'istruzione catch che gestisce questa eccezione. Se il metodo attualmente in esecuzione non contiene un blocco catch, CLR esamina il metodo che ha chiamato il metodo corrente e così via, fino allo stack di chiamate. Se non viene trovato alcun blocco catch, CLR visualizza un messaggio di eccezione non gestito all'utente e arresta l'esecuzione del programma.

Nell'esempio di codice seguente viene illustrato un modo comune di usare try//catchfinally per gestire gli errori.

try
{
    file.ReadBlock(buffer, index, buffer.Length);
}
catch (FileNotFoundException e)
{
    Server.Transfer("NoFileErrorPage.aspx", true);
}
catch (System.IO.IOException e)
{
    Server.Transfer("IOErrorPage.aspx", true);
}

finally
{
    if (file != null)
    {
        file.Close();
    }
}

Nel codice precedente il blocco try contiene il codice che deve essere protetto da una possibile eccezione. Il blocco viene eseguito fino a quando non viene generata un'eccezione o il blocco viene completato correttamente. Se si verifica un'eccezione FileNotFoundException o un'eccezione IOException , l'esecuzione viene trasferita a una pagina diversa. Il codice contenuto nel blocco finally viene quindi eseguito, indipendentemente dal fatto che si sia verificato o meno un errore.

Aggiunta del supporto per la registrazione degli errori

Prima di aggiungere la gestione degli errori all'applicazione di esempio Wingtip Toys, si aggiungerà il supporto per la registrazione degli errori aggiungendo una ExceptionUtility classe alla cartella Logic . In questo modo, ogni volta che l'applicazione gestisce un errore, i dettagli dell'errore verranno aggiunti al file di log degli errori.

  1. Fare clic con il pulsante destro del mouse sulla cartella Logica e quindi scegliere Aggiungi ->Nuovo elemento.
    La finestra di dialogo Aggiungi nuovo elemento viene visualizzata.

  2. Selezionare il gruppo Visual C# -Code templates (Modelli di Visual C# ->Code ) a sinistra. Selezionare quindi Classedall'elenco centrale e denominarla ExceptionUtility.cs.

  3. Scegliere Aggiungi. Viene visualizzato il nuovo file di classe.

  4. Sostituire il codice esistente con quello seguente:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.IO;
    
    namespace WingtipToys.Logic
    {
      // Create our own utility for exceptions
      public sealed class ExceptionUtility
      {
        // All methods are static, so this can be private
        private ExceptionUtility()
        { }
    
        // Log an Exception
        public static void LogException(Exception exc, string source)
        {
          // Include logic for logging exceptions
          // Get the absolute path to the log file
          string logFile = "~/App_Data/ErrorLog.txt";
          logFile = HttpContext.Current.Server.MapPath(logFile);
    
          // Open the log file for append and write the log
          StreamWriter sw = new StreamWriter(logFile, true);
          sw.WriteLine("********** {0} **********", DateTime.Now);
          if (exc.InnerException != null)
          {
            sw.Write("Inner Exception Type: ");
            sw.WriteLine(exc.InnerException.GetType().ToString());
            sw.Write("Inner Exception: ");
            sw.WriteLine(exc.InnerException.Message);
            sw.Write("Inner Source: ");
            sw.WriteLine(exc.InnerException.Source);
            if (exc.InnerException.StackTrace != null)
            {
              sw.WriteLine("Inner Stack Trace: ");
              sw.WriteLine(exc.InnerException.StackTrace);
            }
          }
          sw.Write("Exception Type: ");
          sw.WriteLine(exc.GetType().ToString());
          sw.WriteLine("Exception: " + exc.Message);
          sw.WriteLine("Source: " + source);
          sw.WriteLine("Stack Trace: ");
          if (exc.StackTrace != null)
          {
            sw.WriteLine(exc.StackTrace);
            sw.WriteLine();
          }
          sw.Close();
        }
      }
    }
    

Quando si verifica un'eccezione, l'eccezione può essere scritta in un file di log delle eccezioni chiamando il LogException metodo . Questo metodo accetta due parametri, l'oggetto eccezione e una stringa contenente i dettagli sull'origine dell'eccezione. Il log delle eccezioni viene scritto nel file ErrorLog.txt nella cartella App_Data .

Aggiunta di una pagina di errore

Nell'applicazione di esempio Wingtip Toys verrà usata una pagina per visualizzare gli errori. La pagina di errore è progettata per visualizzare un messaggio di errore sicuro agli utenti del sito. Tuttavia, se l'utente è uno sviluppatore che effettua una richiesta HTTP che viene servita localmente nel computer in cui si trova il codice, nella pagina di errore verranno visualizzati dettagli aggiuntivi sull'errore.

  1. Fare clic con il pulsante destro del mouse sul nome del progetto (Wingtip Toys) in Esplora soluzioni e scegliere Aggiungi ->Nuovo elemento.
    La finestra di dialogo Aggiungi nuovo elemento viene visualizzata.

  2. Selezionare il gruppo Visual C# ->Web templates (Modelli Web) a sinistra. Nell'elenco centrale selezionare Web Form con pagina master e denominarlo ErrorPage.aspx.

  3. Fare clic su Aggiungi.

  4. Selezionare il file Site.Master come pagina master e quindi scegliere OK.

  5. Sostituire il markup esistente con il codice seguente:

    <%@ Page Title="" Language="C#" AutoEventWireup="true" MasterPageFile="~/Site.Master"  CodeBehind="ErrorPage.aspx.cs" Inherits="WingtipToys.ErrorPage" %>
    <asp:Content ID="Content1" ContentPlaceHolderID="MainContent" runat="server">
        <h2>Error:</h2>
        <p></p>
        <asp:Label ID="FriendlyErrorMsg" runat="server" Text="Label" Font-Size="Large" style="color: red"></asp:Label>
    
        <asp:Panel ID="DetailedErrorPanel" runat="server" Visible="false">
            <p>&nbsp;</p>
            <h4>Detailed Error:</h4>
            <p>
                <asp:Label ID="ErrorDetailedMsg" runat="server" Font-Size="Small" /><br />
            </p>
    
            <h4>Error Handler:</h4>
            <p>
                <asp:Label ID="ErrorHandler" runat="server" Font-Size="Small" /><br />
            </p>
    
            <h4>Detailed Error Message:</h4>
            <p>
                <asp:Label ID="InnerMessage" runat="server" Font-Size="Small" /><br />
            </p>
            <p>
                <asp:Label ID="InnerTrace" runat="server"  />
            </p>
        </asp:Panel>
    </asp:Content>
    
  6. Sostituire il codice esistente del code-behind (ErrorPage.aspx.cs) in modo che venga visualizzato come segue:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using WingtipToys.Logic;
    
    namespace WingtipToys
    {
      public partial class ErrorPage : System.Web.UI.Page
      {
        protected void Page_Load(object sender, EventArgs e)
        {
          // Create safe error messages.
          string generalErrorMsg = "A problem has occurred on this web site. Please try again. " +
              "If this error continues, please contact support.";
          string httpErrorMsg = "An HTTP error occurred. Page Not found. Please try again.";
          string unhandledErrorMsg = "The error was unhandled by application code.";
    
          // Display safe error message.
          FriendlyErrorMsg.Text = generalErrorMsg;
    
          // Determine where error was handled.
          string errorHandler = Request.QueryString["handler"];
          if (errorHandler == null)
          {
            errorHandler = "Error Page";
          }
    
          // Get the last error from the server.
          Exception ex = Server.GetLastError();
    
          // Get the error number passed as a querystring value.
          string errorMsg = Request.QueryString["msg"];
          if (errorMsg == "404")
          {
            ex = new HttpException(404, httpErrorMsg, ex);
            FriendlyErrorMsg.Text = ex.Message;
          }
    
          // If the exception no longer exists, create a generic exception.
          if (ex == null)
          {
            ex = new Exception(unhandledErrorMsg);
          }
    
          // Show error details to only you (developer). LOCAL ACCESS ONLY.
          if (Request.IsLocal)
          {
            // Detailed Error Message.
            ErrorDetailedMsg.Text = ex.Message;
    
            // Show where the error was handled.
            ErrorHandler.Text = errorHandler;
    
            // Show local access details.
            DetailedErrorPanel.Visible = true;
    
            if (ex.InnerException != null)
            {
              InnerMessage.Text = ex.GetType().ToString() + "<br/>" +
                  ex.InnerException.Message;
              InnerTrace.Text = ex.InnerException.StackTrace;
            }
            else
            {
              InnerMessage.Text = ex.GetType().ToString();
              if (ex.StackTrace != null)
              {
                InnerTrace.Text = ex.StackTrace.ToString().TrimStart();
              }
            }
          }
    
          // Log the exception.
          ExceptionUtility.LogException(ex, errorHandler);
    
          // Clear the error from the server.
          Server.ClearError();
        }
      }
    }
    

Quando viene visualizzata la pagina di errore, viene eseguito il Page_Load gestore eventi. Page_Load Nel gestore viene determinato il percorso in cui l'errore è stato gestito per la prima volta. Quindi, l'ultimo errore che si è verificato è determinato dalla chiamata al GetLastError metodo dell'oggetto Server. Se l'eccezione non esiste più, viene creata un'eccezione generica. Quindi, se la richiesta HTTP è stata effettuata localmente, vengono visualizzati tutti i dettagli dell'errore. In questo caso, solo il computer locale che esegue l'applicazione Web visualizzerà questi dettagli dell'errore. Dopo la visualizzazione delle informazioni sull'errore, l'errore viene aggiunto al file di log e l'errore viene cancellato dal server.

Visualizzazione di messaggi di errore non gestiti per l'applicazione

Aggiungendo una customErrors sezione al file Web.config , è possibile gestire rapidamente semplici errori che si verificano in tutta l'applicazione. È anche possibile specificare come gestire gli errori in base al valore del codice di stato, ad esempio 404 - File non trovato.

Aggiornare la configurazione

Aggiornare la configurazione aggiungendo una customErrors sezione al file Web.config .

  1. In Esplora soluzioni trovare e aprire il file Web.config nella radice dell'applicazione di esempio Wingtip Toys.

  2. Aggiungere la customErrors sezione al file Web.config all'interno del <system.web> nodo come indicato di seguito:

    <configuration>
      <system.web>
        <customErrors mode="On" defaultRedirect="ErrorPage.aspx?handler=customErrors%20section%20-%20Web.config">
          <error statusCode="404" redirect="ErrorPage.aspx?msg=404&amp;handler=customErrors%20section%20-%20Web.config"/>
        </customErrors>
      </system.web>
    </configuration>
    
  3. Salvare il file Web.config.

La customErrors sezione specifica la modalità , che è impostata su "Sì". Specifica inoltre , defaultRedirectche indica all'applicazione quale pagina passare quando si verifica un errore. Inoltre, è stato aggiunto un elemento di errore specifico che specifica come gestire un errore 404 quando non viene trovata una pagina. Più avanti in questa esercitazione si aggiungeranno altre operazioni di gestione degli errori che acquisiranno i dettagli di un errore a livello di applicazione.

Esecuzione dell'applicazione

È ora possibile eseguire l'applicazione per visualizzare le route aggiornate.

  1. Premere F5 per eseguire l'applicazione di esempio Wingtip Toys.
    Il browser si apre e mostra la pagina Default.aspx .

  2. Immettere l'URL seguente nel browser (assicurarsi di usare il numero di porta):
    https://localhost:44300/NoPage.aspx

  3. Esaminare errorPage.aspx visualizzato nel browser.

    gestione degli errori ASP.NET - Errore di pagina non trovato

Quando si richiede la pagina NoPage.aspx , che non esiste, la pagina di errore mostrerà il messaggio di errore semplice e le informazioni dettagliate sull'errore, se sono disponibili dettagli aggiuntivi. Tuttavia, se l'utente ha richiesto una pagina inesistente da una posizione remota, la pagina di errore visualizzerebbe solo il messaggio di errore in rosso.

Inclusione di un'eccezione a scopo di test

Per verificare il funzionamento dell'applicazione quando si verifica un errore, è possibile creare deliberatamente condizioni di errore in ASP.NET. Nell'applicazione di esempio Wingtip Toys verrà generata un'eccezione di test quando la pagina predefinita viene caricata per vedere cosa accade.

  1. Aprire il code-behind della pagina Default.aspx in Visual Studio.
    Verrà visualizzata la pagina code-behind Default.aspx.cs .

  2. Page_Load Nel gestore aggiungere il codice in modo che il gestore venga visualizzato come segue:

    protected void Page_Load(object sender, EventArgs e)
    {
        throw new InvalidOperationException("An InvalidOperationException " +
        "occurred in the Page_Load handler on the Default.aspx page.");
    }
    

È possibile creare diversi tipi di eccezioni. Nel codice precedente si crea un oggetto InvalidOperationException quando viene caricata la pagina Default.aspx .

Esecuzione dell'applicazione

È possibile eseguire l'applicazione per vedere come l'applicazione gestisce l'eccezione.

  1. Premere CTRL+F5 per eseguire l'applicazione di esempio Wingtip Toys.
    L'applicazione genera l'eccezione InvalidOperationException.

    Nota

    È necessario premere CTRL+F5 per visualizzare la pagina senza interrompere il codice per visualizzare l'origine dell'errore in Visual Studio.

  2. Esaminare errorPage.aspx visualizzato nel browser.

    gestione degli errori ASP.NET - Pagina degli errori

Come si può vedere nei dettagli dell'errore, l'eccezione è stata intrappolata dalla customError sezione nel file Web.config .

Aggiunta della gestione degli errori di Application-Level

Anziché intercettare l'eccezione usando la customErrors sezione nel file diWeb.config , in cui si ottengono poche informazioni sull'eccezione, è possibile intercettare l'errore a livello di applicazione e recuperare i dettagli dell'errore.

  1. In Esplora soluzioni trovare e aprire il file Global.asax.cs.

  2. Aggiungere un gestore Application_Error in modo che venga visualizzato come segue:

    void Application_Error(object sender, EventArgs e)
    {
      // Code that runs when an unhandled error occurs.
    
      // Get last error from the server
      Exception exc = Server.GetLastError();
    
      if (exc is HttpUnhandledException)
      {
        if (exc.InnerException != null)
        {
          exc = new Exception(exc.InnerException.Message);
          Server.Transfer("ErrorPage.aspx?handler=Application_Error%20-%20Global.asax",
              true);
        }
      }
    }
    

Quando si verifica un errore nell'applicazione, viene chiamato il Application_Error gestore. In questo gestore viene recuperata e esaminata l'ultima eccezione. Se l'eccezione non è stata gestita e l'eccezione contiene i dettagli dell'eccezione interna, ovvero non null, InnerException l'applicazione trasferisce l'esecuzione alla pagina di errore in cui vengono visualizzati i dettagli dell'eccezione.

Esecuzione dell'applicazione

È possibile eseguire l'applicazione per visualizzare i dettagli aggiuntivi dell'errore forniti gestendo l'eccezione a livello di applicazione.

  1. Premere CTRL+F5 per eseguire l'applicazione di esempio Wingtip Toys.
    L'applicazione genera l'eccezione InvalidOperationException .

  2. Esaminare errorPage.aspx visualizzato nel browser.

    gestione degli errori ASP.NET - Errore a livello di applicazione

Aggiunta della gestione degli errori di Page-Level

È possibile aggiungere la gestione degli errori a livello di pagina a una pagina usando l'aggiunta di un ErrorPage attributo alla @Page direttiva della pagina o aggiungendo un Page_Error gestore eventi al code-behind di una pagina. In questa sezione si aggiungerà un Page_Error gestore eventi che trasferisce l'esecuzione alla pagina ErrorPage.aspx .

  1. In Esplora soluzioni trovare e aprire il file Default.aspx.cs.

  2. Aggiungere un Page_Error gestore in modo che il code-behind venga visualizzato come segue:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    
    namespace WingtipToys
    {
      public partial class _Default : Page
      {
        protected void Page_Load(object sender, EventArgs e)
        {
          throw new InvalidOperationException("An InvalidOperationException " +
          "occurred in the Page_Load handler on the Default.aspx page.");
        }
    
        private void Page_Error(object sender, EventArgs e)
        {
          // Get last error from the server.
          Exception exc = Server.GetLastError();
    
          // Handle specific exception.
          if (exc is InvalidOperationException)
          {
            // Pass the error on to the error page.
            Server.Transfer("ErrorPage.aspx?handler=Page_Error%20-%20Default.aspx",
                true);
          }
        }
      }
    }
    

Quando si verifica un errore nella pagina, viene chiamato il Page_Error gestore eventi. In questo gestore viene recuperata e esaminata l'ultima eccezione. Se si verifica un InvalidOperationException oggetto , il gestore eventi trasferisce l'esecuzione Page_Error alla pagina di errore in cui vengono visualizzati i dettagli dell'eccezione.

Esecuzione dell'applicazione

È ora possibile eseguire l'applicazione per visualizzare le route aggiornate.

  1. Premere CTRL+F5 per eseguire l'applicazione di esempio Wingtip Toys.
    L'applicazione genera l'eccezione InvalidOperationException .

  2. Esaminare errorPage.aspx visualizzato nel browser.

    gestione degli errori ASP.NET - Errore a livello di pagina

  3. Chiudere la finestra del browser.

Rimozione dell'eccezione usata per il test

Per consentire all'applicazione di esempio Wingtip Toys di funzionare senza generare l'eccezione aggiunta in precedenza in questa esercitazione, rimuovere l'eccezione.

  1. Aprire il code-behind della pagina Default.aspx .

  2. Page_Load Nel gestore rimuovere il codice che genera l'eccezione in modo che il gestore venga visualizzato come segue:

    protected void Page_Load(object sender, EventArgs e)
    {
    
    }
    

Aggiunta della registrazione degli errori di Code-Level

Come accennato in precedenza in questa esercitazione, è possibile aggiungere istruzioni try/catch per tentare di eseguire una sezione di codice e gestire il primo errore che si verifica. In questo esempio verranno scritti solo i dettagli dell'errore nel file di log degli errori in modo che l'errore possa essere esaminato in un secondo momento.

  1. In Esplora soluzioni, nella cartella Logic trovare e aprire il file PayPalFunctions.cs.

  2. Aggiornare il HttpCall metodo in modo che il codice venga visualizzato come segue:

    public string HttpCall(string NvpRequest)
    {
      string url = pEndPointURL;
    
      string strPost = NvpRequest + "&" + buildCredentialsNVPString();
      strPost = strPost + "&BUTTONSOURCE=" + HttpUtility.UrlEncode(BNCode);
    
      HttpWebRequest objRequest = (HttpWebRequest)WebRequest.Create(url);
      objRequest.Timeout = Timeout;
      objRequest.Method = "POST";
      objRequest.ContentLength = strPost.Length;
    
      try
      {
        using (StreamWriter myWriter = new StreamWriter(objRequest.GetRequestStream()))
        {
          myWriter.Write(strPost);
        }
      }
      catch (Exception e)
      {
        // Log the exception.
        WingtipToys.Logic.ExceptionUtility.LogException(e, "HttpCall in PayPalFunction.cs");
      }
    
      //Retrieve the Response returned from the NVP API call to PayPal.
      HttpWebResponse objResponse = (HttpWebResponse)objRequest.GetResponse();
      string result;
      using (StreamReader sr = new StreamReader(objResponse.GetResponseStream()))
      {
        result = sr.ReadToEnd();
      }
    
      return result;
    }
    

Il codice precedente chiama il LogException metodo contenuto nella ExceptionUtility classe . In questa esercitazione è stato aggiunto il file di classe ExceptionUtility.cs alla cartella Logic . Il metodo LogException accetta due parametri. Il primo parametro è l'oggetto eccezione. Il secondo parametro è una stringa usata per riconoscere l'origine dell'errore.

Controllo delle informazioni di registrazione degli errori

Come accennato in precedenza, è possibile usare il log degli errori per determinare quali errori nell'applicazione devono essere corretti per primi. Naturalmente, verranno registrati solo gli errori che sono stati intrappolati e scritti nel log degli errori.

  1. In Esplora soluzioni trovare e aprire il file ErrorLog.txt nella cartella App_Data.
    Potrebbe essere necessario selezionare l'opzione "Mostra tutti i file" o l'opzione "Aggiorna" nella parte superiore di Esplora soluzioni per visualizzare il file ErrorLog.txt.

  2. Esaminare il log degli errori visualizzato in Visual Studio:

    gestione degli errori ASP.NET - ErrorLog.txt

Messaggi di errore sicuri

È importante notare che quando l'applicazione visualizza i messaggi di errore, non deve fornire informazioni che un utente malintenzionato potrebbe trovare utile per attaccare l'applicazione. Ad esempio, se l'applicazione tenta in modo non riuscito di scrivere in un database, non deve visualizzare un messaggio di errore che include il nome utente in uso. Per questo motivo, all'utente viene visualizzato un messaggio di errore generico in rosso. Tutti i dettagli aggiuntivi sull'errore vengono visualizzati solo allo sviluppatore nel computer locale.

Uso di ELMAH

ELMAH (Error Logging Modules and Handlers) è una funzionalità di registrazione degli errori che si collega all'applicazione ASP.NET come pacchetto NuGet. ELMAH offre le funzionalità seguenti:

  • Registrazione di eccezioni non gestite.
  • Pagina Web per visualizzare l'intero log delle eccezioni non gestite codificate.
  • Pagina Web per visualizzare i dettagli completi di ogni eccezione registrata.
  • Notifica tramite posta elettronica di ogni errore al momento in cui si verifica.
  • Feed RSS degli ultimi 15 errori del log.

Prima di poter usare ELMAH, è necessario installarlo. È facile usare il programma di installazione del pacchetto NuGet . Come accennato in precedenza in questa serie di esercitazioni, NuGet è un'estensione di Visual Studio che semplifica l'installazione e l'aggiornamento di librerie e strumenti open source in Visual Studio.

  1. In Visual Studio scegliere Gestione pacchetti>NuGet per la soluzione dal menu Strumenti.

    gestione degli errori ASP.NET - Gestire i pacchetti NuGet per la soluzione

  2. La finestra di dialogo Gestisci pacchetti NuGet viene visualizzata in Visual Studio.

  3. Nella finestra di dialogo Gestisci pacchetti NuGet espandere Online a sinistra e quindi selezionare nuget.org. Trovare e installare quindi il pacchetto ELMAH dall'elenco dei pacchetti disponibili online.

    gestione degli errori ASP.NET - Pacchetto NuGet ELMA

  4. Per scaricare il pacchetto, sarà necessario disporre di una connessione Internet.

  5. Nella finestra di dialogo Seleziona progetti verificare che sia selezionata la selezione WingtipToys e quindi fare clic su OK.

    gestione degli errori ASP.NET - Finestra di dialogo Seleziona progetti

  6. Fare clic su Chiudi nella finestra di dialogo Gestisci pacchetti NuGet , se necessario.

  7. Se Visual Studio richiede di ricaricare i file aperti, selezionare "Sì a tutti".

  8. Il pacchetto ELMAH aggiunge voci per se stesso nel file Web.config alla radice del progetto. Se Visual Studio chiede se si desidera ricaricare il file diWeb.config modificato, fare clic su .

ELMAH è ora pronto per archiviare eventuali errori non gestiti che si verificano.

Visualizzazione del log ELMAH

La visualizzazione del log ELMAH è semplice, ma prima si creerà un'eccezione non gestita che verrà registrata nel log ELMAH.

  1. Premere CTRL+F5 per eseguire l'applicazione di esempio Wingtip Toys.

  2. Per scrivere un'eccezione non gestita nel log ELMAH, passare nel browser all'URL seguente (usando il numero di porta):
    https://localhost:44300/NoPage.aspx Verrà visualizzata la pagina di errore.

  3. Per visualizzare il log ELMAH, passare nel browser all'URL seguente (usando il numero di porta):
    https://localhost:44300/elmah.axd

    gestione degli errori ASP.NET - Log degli errori ELMAH

Riepilogo

In questa esercitazione si è appreso come gestire gli errori a livello di applicazione, a livello di pagina e a livello di codice. Si è anche appreso come registrare gli errori gestiti e non gestiti per una revisione successiva. È stata aggiunta l'utilità ELMAH per fornire la registrazione delle eccezioni e la notifica all'applicazione usando NuGet. Inoltre, si è appreso l'importanza dei messaggi di errore sicuri.

Conclusione della serie di esercitazioni

Grazie per aver seguito. Spero che questo set di esercitazioni ti abbia aiutato a acquisire familiarità con Web Forms ASP.NET. Per altre informazioni sulle funzionalità di Web Forms disponibili in ASP.NET 4.5 e Visual Studio 2013, vedere ASP.NET and Web Tools per Visual Studio 2013 note sulla versione. Assicurarsi anche di esaminare l'esercitazione descritta nella sezione Passaggi successivi e provare la versione di valutazione gratuita di Azure.

Grazie - Erik

Passaggi successivi

Altre informazioni sulla distribuzione dell'applicazione Web in Microsoft Azure, vedere Distribuire un'app di Web Forms ASP.NET sicura con appartenenza, OAuth e database SQL in un sito Web di Azure.

Versione di valutazione gratuita

Microsoft Azure - Versione di valutazione gratuita
La pubblicazione del sito Web in Microsoft Azure consente di risparmiare tempo, manutenzione e spese. È un processo rapido per distribuire l'app Web in Azure. Quando è necessario gestire e monitorare l'app Web, Azure offre un'ampia gamma di strumenti e servizi. Gestire dati, traffico, identità, backup, messaggistica, supporti e prestazioni in Azure. E tutto questo viene fornito in un approccio molto conveniente.

Risorse aggiuntive

Registrazione dei dettagli degli errori con monitoraggio dell'integrità di ASP.NET
ELMAH

Riconoscimenti

Vorrei ringraziare le persone seguenti che hanno apportato contributi significativi al contenuto di questa serie di esercitazioni:

Contributi della community