Sdílet prostřednictvím


Zpracování chyb v ASP.NET

Erik Reitan

Stáhnout ukázkový projekt Wingtip Toys (C#) nebo Stáhnout elektronickou knihu (PDF)

Tato série kurzů vás naučí základy vytváření ASP.NET Web Forms aplikace pomocí ASP.NET 4.5 a Microsoft Visual Studio Express 2013 pro web. K této sérii kurzů je k dispozici Visual Studio 2013 projekt se zdrojovým kódem jazyka C#.

V tomto kurzu upravíte ukázkovou aplikaci Wingtip Toys tak, aby zahrnovala zpracování chyb a protokolování chyb. Zpracování chyb umožní aplikaci řádně zpracovávat chyby a odpovídajícím způsobem zobrazovat chybové zprávy. Protokolování chyb vám umožní vyhledat a opravit chyby, ke kterým došlo. Tento kurz vychází z předchozího kurzu Směrování adres URL a je součástí série kurzů Wingtip Toys.

Naučíte se:

  • Postup přidání globálního zpracování chyb do konfigurace aplikace
  • Postup přidání zpracování chyb na úrovni aplikace, stránky a kódu
  • Jak protokolovat chyby pro pozdější kontrolu.
  • Jak zobrazit chybové zprávy, které neohrožují zabezpečení.
  • Postup implementace protokolování chyb modulů a obslužných rutin (ELMAH)

Přehled

ASP.NET aplikace musí být schopné konzistentním způsobem zpracovávat chyby, ke kterým dochází během provádění. ASP.NET používá modul CLR (Common Language Runtime), který poskytuje jednotný způsob oznamování chyb aplikacím. Když dojde k chybě, vyvolá se výjimka. Výjimkou je jakákoli chyba, podmínka nebo neočekávané chování, na které aplikace narazí.

V rozhraní .NET Framework je výjimkou objekt, který dědí z System.Exception třídy . Z oblasti kódu, ve které došlo k problému, je vyvolán výjimka. Výjimka je předána zásobník volání do místa, kde aplikace poskytuje kód pro zpracování výjimky. Pokud aplikace nezpracuje výjimku, prohlížeč je nucen zobrazit podrobnosti o chybě.

Osvědčeným postupem je zpracování chyb na úrovni kódu v Try//CatchFinally blocích v kódu. Zkuste tyto bloky umístit tak, aby uživatel mohl opravit problémy v kontextu, ve kterém k nim došlo. Pokud jsou bloky zpracování chyb příliš daleko od místa, kde k chybě došlo, je obtížnější poskytnout uživatelům informace, které potřebují k vyřešení problému.

Exception – třída

Třída Exception je základní třída, ze které dědí výjimky. Většina objektů výjimek jsou instancemi některé odvozené třídy třídy Exception, jako SystemException je třída, IndexOutOfRangeException třída nebo ArgumentNullException třída. Třída Exception má vlastnosti, jako StackTrace je například vlastnost, InnerException vlastnost a Message vlastnost, které poskytují konkrétní informace o chybě, ke které došlo.

Hierarchie dědičnosti výjimek

Modul runtime má základní sadu výjimek odvozených z SystemException třídy, kterou modul runtime vyvolá, když dojde k výjimce. Většina tříd, které dědí z třídy Exception, jako IndexOutOfRangeException je třída a ArgumentNullException třída, neimplementují další členy. Proto nejdůležitější informace o výjimce najdete v hierarchii výjimek, v názvu výjimky a v informacích obsažených ve výjimce.

Hierarchie zpracování výjimek

V aplikaci ASP.NET Web Forms lze výjimky zpracovávat na základě konkrétní hierarchie zpracování. Výjimku je možné zpracovat na následujících úrovních:

  • Úroveň aplikace
  • Na úrovni stránek
  • Úroveň kódu

Když aplikace zpracovává výjimky, mohou být další informace o výjimce, která je zděděna z třídy Exception, často načteny a zobrazeny uživateli. Kromě úrovně aplikace, stránky a kódu můžete také zpracovávat výjimky na úrovni modulu HTTP a pomocí vlastní obslužné rutiny služby IIS.

Zpracování chyb na úrovni aplikace

Výchozí chyby můžete zpracovat na úrovni aplikace úpravou konfigurace aplikace nebo přidáním obslužné Application_Error rutiny do souboru Global.asax vaší aplikace.

Výchozí chyby a chyby PROTOKOLU HTTP můžete zpracovat přidáním oddílu customErrors do souboruWeb.config . Oddíl customErrors umožňuje určit výchozí stránku, na kterou budou uživatelé přesměrováni, když dojde k chybě. Umožňuje také zadat jednotlivé stránky pro konkrétní chyby stavových kódů.

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

Při použití konfigurace k přesměrování uživatele na jinou stránku bohužel nemáte podrobnosti o chybě, ke které došlo.

Můžete však zachytit chyby, ke kterým dochází kdekoli ve vaší aplikaci, přidáním kódu do obslužné rutiny Application_Error v souboru 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);
    }
}

Zpracování událostí chyb na úrovni stránky

Obslužná rutina na úrovni stránky vrátí uživatele na stránku, kde došlo k chybě, ale protože instance ovládacích prvků nejsou zachovány, na stránce už nic nebude. Chcete-li uživateli aplikace poskytnout podrobnosti o chybě, musíte na stránku zapsat podrobnosti o chybě.

Obvykle byste použili obslužnou rutinu chyb na úrovni stránky k protokolování neošetřených chyb nebo k tomu, abyste uživatele převezli na stránku, která může zobrazit užitečné informace.

Tento příklad kódu ukazuje obslužnou rutinu pro událost Error na webové stránce ASP.NET. Tato obslužná rutina zachytává všechny výjimky, které ještě nejsou zpracovány v try/catch rámci bloků na stránce.

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();
}

Jakmile zpracujete chybu, musíte ji vymazat voláním ClearError metody objektu Server (HttpServerUtility ), jinak se zobrazí chyba, ke které došlo dříve.

Zpracování chyb na úrovni kódu

Příkaz try-catch se skládá z bloku try následovaného jednou nebo více klauzulemi catch, které určují obslužné rutiny pro různé výjimky. Když dojde k výjimce, modul CLR (Common Language Runtime) vyhledá příkaz catch, který tuto výjimku zpracovává. Pokud aktuálně spuštěná metoda neobsahuje blok catch, clr se podívá na metodu, která volala aktuální metodu, a tak dále, nahoru zásobník volání. Pokud se nenajde žádný blok catch, modul CLR zobrazí uživateli neošetřenou zprávu o výjimce a zastaví provádění programu.

Následující příklad kódu ukazuje běžný způsob použití try//catchfinally ke zpracování chyb.

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();
    }
}

Blok try ve výše uvedeném kódu obsahuje kód, který je potřeba chránit před možnou výjimkou. Blok se spustí, dokud nedojde k výjimce nebo dokud se blok úspěšně nedokončil. Pokud dojde k výjimce FileNotFoundException nebo výjimce IOException , spuštění se přenese na jinou stránku. Pak se spustí kód obsažený v bloku finally, ať už došlo k chybě, nebo ne.

Přidání podpory protokolování chyb

Před přidáním zpracování chyb do ukázkové aplikace Wingtip Toys přidáte podporu protokolování chyb přidáním ExceptionUtility třídy do složky Logic . Když to uděláte, pokaždé, když aplikace zpracuje chybu, přidají se podrobnosti o chybě do souboru protokolu chyb.

  1. Klikněte pravým tlačítkem na složku Logika a pak vyberte Přidat ->Nová položka.
    Zobrazí se dialogové okno Přidat novou položku.

  2. Na levé straně vyberte skupinu Šablony Visual C# ->Code . Potom v prostředním seznamu vyberte Třídaa pojmenujte ji ExceptionUtility.cs.

  3. Zvolte Přidat. Zobrazí se nový soubor třídy.

  4. Nahraďte stávající kód následujícím kódem:

    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();
        }
      }
    }
    

Když dojde k výjimce, může být výjimka zapsána do souboru protokolu výjimky voláním LogException metody . Tato metoda přijímá dva parametry, objekt výjimky a řetězec obsahující podrobnosti o zdroji výjimky. Protokol výjimek se zapíše do souboruErrorLog.txt ve složce App_Data .

Přidání chybové stránky

V ukázkové aplikaci Wingtip Toys se k zobrazení chyb použije jedna stránka. Chybová stránka je navržená tak, aby uživatelům webu zobrazovala zabezpečenou chybovou zprávu. Pokud je ale uživatel vývojář, který vytváří požadavek HTTP, který se obsluhuje místně na počítači, kde se kód nachází, zobrazí se na chybové stránce další podrobnosti o chybě.

  1. V Průzkumník řešení klikněte pravým tlačítkem na název projektu (Wingtip Toys) a vyberte Přidat ->Nová položka.
    Zobrazí se dialogové okno Přidat novou položku.

  2. Na levé straně vyberte skupinu Šablony Visual C# ->Web . V prostředním seznamu vyberte Webový formulář se stránkou předlohy a pojmenujte ho ErrorPage.aspx.

  3. Klikněte na Přidat.

  4. Jako stránku předlohy vyberte soubor Site.Master a pak zvolte OK.

  5. Existující kód nahraďte následujícím kódem:

    <%@ 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. Nahraďte existující kód kódu na pozadí (ErrorPage.aspx.cs) tak, aby se zobrazil takto:

    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();
        }
      }
    }
    

Při zobrazení Page_Load chybové stránky se spustí obslužná rutina události. V obslužné rutině Page_Load se určí umístění, kde byla chyba poprvé zpracována. Poslední chyba, ke které došlo, je určena voláním GetLastError metody objektu Server. Pokud výjimka již neexistuje, vytvoří se obecná výjimka. Pokud se pak požadavek HTTP provedl místně, zobrazí se všechny podrobnosti o chybách. V takovém případě se tyto podrobnosti o chybě zobrazí pouze na místním počítači, na kterém běží webová aplikace. Po zobrazení informací o chybě se chyba přidá do souboru protokolu a ze serveru se tato chyba vymaže.

Zobrazení neošetřených chybových zpráv pro aplikaci

Přidáním oddílu customErrors do souboruWeb.config můžete rychle zpracovat jednoduché chyby, ke kterým dochází v celé aplikaci. Můžete také určit, jak se mají zpracovávat chyby na základě hodnoty jejich stavového kódu, například 404 – Soubor nebyl nalezen.

Aktualizace konfigurace

Aktualizujte konfiguraci přidáním oddílu customErrors do souboruWeb.config .

  1. V Průzkumník řešení vyhledejte a otevřete souborWeb.config v kořenovém adresáři ukázkové aplikace Wingtip Toys.

  2. customErrors Přidejte oddíl do souboruWeb.config v <system.web> uzlu následujícím způsobem:

    <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. Uložte souborWeb.config .

Oddíl customErrors určuje režim, který je nastavený na Zapnuto. Také určuje defaultRedirect, který aplikaci řekne, na kterou stránku se má přejít, když dojde k chybě. Kromě toho jste přidali konkrétní prvek chyby, který určuje, jak zpracovat chybu 404, když není nalezena stránka. Později v tomto kurzu přidáte další zpracování chyb, které zachytí podrobnosti o chybě na úrovni aplikace.

Spuštění aplikace

Aplikaci teď můžete spustit, abyste viděli aktualizované trasy.

  1. Stisknutím klávesy F5 spusťte ukázkovou aplikaci Wingtip Toys.
    Otevře se prohlížeč a zobrazí stránku Default.aspx .

  2. Do prohlížeče zadejte následující adresu URL (nezapomeňte použít číslo portu):
    https://localhost:44300/NoPage.aspx

  3. Zkontrolujte soubor ErrorPage.aspx zobrazený v prohlížeči.

    ASP.NET zpracování chyb – Chyba Stránka nenalezena

Když požádáte o stránku NoPage.aspx , která neexistuje, zobrazí se na chybové stránce jednoduchá chybová zpráva a podrobné informace o chybě, pokud jsou k dispozici další podrobnosti. Pokud však uživatel požádal o neexistující stránku ze vzdáleného umístění, chybová stránka by zobrazila pouze chybovou zprávu červeně.

Zahrnutí výjimky pro účely testování

Pokud chcete ověřit, jak bude aplikace fungovat, když dojde k chybě, můžete záměrně vytvořit chybové podmínky v ASP.NET. V ukázkové aplikaci Wingtip Toys vyvoláte při načtení výchozí stránky testovací výjimku, abyste zjistili, co se stane.

  1. Otevřete kód na pozadí stránky Default.aspx v sadě Visual Studio.
    Zobrazí se stránka s kódem Default.aspx.cs .

  2. V obslužné rutině Page_Load přidejte kód tak, aby se obslužná rutina zobrazila takto:

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

Je možné vytvářet různé typy výjimek. Ve výše uvedeném kódu vytváříte při InvalidOperationException načtení stránky Default.aspx .

Spuštění aplikace

Spuštěním aplikace můžete zjistit, jak aplikace nakládá s výjimkou.

  1. Stisknutím kombinace kláves CTRL+F5 spusťte ukázkovou aplikaci Wingtip Toys.
    Aplikace vyvolá výjimku InvalidOperationException.

    Poznámka

    Chcete-li zobrazit zdroj chyby v sadě Visual Studio, musíte stisknout kombinaci kláves CTRL+F5 , aby se stránka zobrazila bez vloupání do kódu.

  2. Zkontrolujte soubor ErrorPage.aspx zobrazený v prohlížeči.

    ASP.NET zpracování chyb – chybová stránka

Jak je vidět v podrobnostech o chybě, výjimka byla zachycena oddílem customError v souboruWeb.config .

Přidání Application-Level zpracování chyb

Místo zachycení výjimky pomocí oddílu customErrors v souboru Web.config , kde získáte málo informací o výjimce, můžete chybu zachytit na úrovni aplikace a načíst podrobnosti o chybě.

  1. V Průzkumník řešení vyhledejte a otevřete soubor Global.asax.cs.

  2. Přidejte obslužnou rutinu Application_Error tak, aby se zobrazila takto:

    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);
        }
      }
    }
    

Když v aplikaci dojde k chybě, Application_Error je volána obslužná rutina. V této obslužné rutině se načte a zkontroluje poslední výjimka. Pokud byla výjimka neošetřená a výjimka obsahuje podrobnosti o vnitřní výjimce (to znamená, že nemá hodnotu null), aplikace přenese spuštění na chybovou stránku, InnerException kde jsou zobrazeny podrobnosti o výjimce.

Spuštění aplikace

Spuštěním aplikace můžete zobrazit další podrobnosti o chybách, které poskytuje zpracování výjimky na úrovni aplikace.

  1. Stisknutím kombinace kláves CTRL+F5 spusťte ukázkovou aplikaci Wingtip Toys.
    Aplikace vyvolá .InvalidOperationException

  2. Zkontrolujte soubor ErrorPage.aspx zobrazený v prohlížeči.

    ASP.NET zpracování chyb – Chyba na úrovni aplikace

Přidání Page-Level zpracování chyb

Zpracování chyb na úrovni stránky můžete na stránku přidat buď přidáním atributu ErrorPage@Page do direktivy stránky, nebo přidáním obslužné Page_Error rutiny události do kódu na pozadí stránky. V této části přidáte obslužnou rutinu Page_Error události, která přenese provádění na stránku ErrorPage.aspx .

  1. V Průzkumník řešení vyhledejte a otevřete soubor Default.aspx.cs.

  2. Přidejte obslužnou rutinu Page_Error , aby se kód na pozadí zobrazil takto:

    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);
          }
        }
      }
    }
    

Pokud na stránce dojde k chybě, Page_Error je volána obslužná rutina události. V této obslužné rutině se načte a zkontroluje poslední výjimka. InvalidOperationException Pokud dojde k události, Page_Error obslužná rutina události přenese spuštění na chybovou stránku, kde jsou zobrazeny podrobnosti o výjimce.

Spuštění aplikace

Aplikaci teď můžete spustit, abyste viděli aktualizované trasy.

  1. Stisknutím kombinace kláves CTRL+F5 spusťte ukázkovou aplikaci Wingtip Toys.
    Aplikace vyvolá .InvalidOperationException

  2. Zkontrolujte soubor ErrorPage.aspx zobrazený v prohlížeči.

    ASP.NET zpracování chyb – Chyba na úrovni stránky

  3. Zavřete okno prohlížeče.

Odebrání výjimky použité k testování

Pokud chcete, aby ukázková aplikace Wingtip Toys fungovala bez vyvolání výjimky, kterou jste přidali dříve v tomto kurzu, odeberte výjimku.

  1. Otevřete kód na pozadí stránky Default.aspx .

  2. V obslužné rutině Page_Load odeberte kód, který vyvolá výjimku, aby se obslužná rutina zobrazila takto:

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

Přidání protokolování chyb Code-Level

Jak je uvedeno dříve v tomto kurzu, můžete přidat příkazy try/catch, které se pokusí spustit část kódu a zpracovat první chybu, ke které dojde. V tomto příkladu zapíšete pouze podrobnosti o chybě do souboru protokolu chyb, aby bylo možné chybu později zkontrolovat.

  1. V Průzkumník řešení ve složce Logika najděte a otevřete soubor PayPalFunctions.cs.

  2. Aktualizujte metodu HttpCall tak, aby se kód zobrazil takto:

    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;
    }
    

Výše uvedený kód volá metodu LogException , která je obsažena ExceptionUtility ve třídě. Soubor třídy ExceptionUtility.cs jste přidali do složky Logika dříve v tomto kurzu. Metoda LogException přijímá dva parametry. Prvním parametrem je objekt výjimky. Druhý parametr je řetězec, který se používá k rozpoznání zdroje chyby.

Kontrola informací protokolování chyb

Jak bylo zmíněno dříve, můžete pomocí protokolu chyb určit, které chyby ve vaší aplikaci by se měly opravit jako první. Samozřejmě se budou zaznamenávat jenom chyby, které byly zachyceny a zapsány do protokolu chyb.

  1. V Průzkumník řešení vyhledejte a otevřete soubor ErrorLog.txt ve složce App_Data.
    Abyste viděli souborErrorLog.txt, možná budete muset v horní části Průzkumník řešení vybrat možnostZobrazit všechny soubory nebo Aktualizovat.

  2. Zkontrolujte protokol chyb zobrazený v sadě Visual Studio:

    zpracování chyb ASP.NET – ErrorLog.txt

Bezpečné chybové zprávy

Je důležité si uvědomit , že když aplikace zobrazuje chybové zprávy, neměla by prozradit informace, které by mohl uživatel se zlými úmysly považovat za užitečné při útoku na vaši aplikaci. Pokud se například aplikace neúspěšně pokusí o zápis do databáze, neměla by zobrazit chybovou zprávu obsahující uživatelské jméno, které používá. Z tohoto důvodu se uživateli zobrazí obecná chybová zpráva červeně. Všechny další podrobnosti o chybách se zobrazí jenom vývojáři na místním počítači.

Použití ELMAH

ELMAH (moduly a obslužné rutiny protokolování chyb) je zařízení pro protokolování chyb, které připojíte do ASP.NET aplikace jako balíček NuGet. ELMAH poskytuje následující funkce:

  • Protokolování neošetřených výjimek
  • Webová stránka pro zobrazení celého protokolu překódovaných neošetřených výjimek.
  • Webová stránka pro zobrazení úplných podrobností o každé zaprotokolované výjimce.
  • E-mailové oznámení o každé chybě v okamžiku, kdy k ní dojde.
  • Informační kanál RSS o posledních 15 chybách z protokolu.

Než budete moct pracovat s ELMAH, musíte ho nainstalovat. To je snadné pomocí instalačního programu balíčků NuGet . Jak je uvedeno dříve v této sérii kurzů, NuGet je rozšíření sady Visual Studio, které usnadňuje instalaci a aktualizaci open source knihoven a nástrojů v sadě Visual Studio.

  1. V sadě Visual Studio v nabídce Nástroje vyberte Správce> balíčků NuGetSpravovat balíčky NuGet pro řešení.

    ASP.NET zpracování chyb – Správa balíčků NuGet pro řešení

  2. V sadě Visual Studio se zobrazí dialogové okno Spravovat balíčky NuGet .

  3. V dialogovém okně Spravovat balíčky NuGet rozbalte na levé straně položku Online a pak vyberte nuget.org. Pak vyhledejte a nainstalujte balíček ELMAH ze seznamu dostupných balíčků online.

    ASP.NET zpracování chyb – balíček NuGet ELMA

  4. Ke stažení balíčku budete muset mít připojení k internetu.

  5. V dialogovém okně Vybrat projekty se ujistěte, že je vybraná možnost WingtipToys , a klikněte na OK.

    ASP.NET zpracování chyb – dialogové okno Vybrat projekty

  6. V případě potřeby klikněte v dialogovém okně Spravovat balíčky NuGet na Zavřít.

  7. Pokud Visual Studio požádá o opětovné načtení všech otevřených souborů, vyberte Možnost Ano všem.

  8. Balíček ELMAH přidá položky pro sebe do souboruWeb.config v kořenovém adresáři projektu. Pokud se vás Visual Studio zeptá, jestli chcete upravený souborWeb.config znovu načíst, klikněte na Ano.

ELMAH je teď připravena ukládat všechny neošetřené chyby, ke kterým dojde.

Zobrazení protokolu ELMAH

Zobrazení protokolu ELMAH je snadné, ale nejprve vytvoříte neošetřenou výjimku, která se zaznamená do protokolu ELMAH.

  1. Stisknutím kombinace kláves CTRL+F5 spusťte ukázkovou aplikaci Wingtip Toys.

  2. Pokud chcete do protokolu ELMAH zapsat neošetřenou výjimku, přejděte v prohlížeči na následující adresu URL (pomocí čísla portu):
    https://localhost:44300/NoPage.aspx Zobrazí se chybová stránka.

  3. Pokud chcete zobrazit protokol ELMAH, přejděte v prohlížeči na následující adresu URL (pomocí čísla portu):
    https://localhost:44300/elmah.axd

    ASP.NET zpracování chyb – Protokol chyb ELMAH

Souhrn

V tomto kurzu jste se dozvěděli o zpracování chyb na úrovni aplikace, na úrovni stránky a na úrovni kódu. Také jste zjistili, jak protokolovat zpracovávané a neošetřené chyby pro pozdější kontrolu. Přidali jste nástroj ELMAH, který vaší aplikaci pomocí NuGetu poskytuje protokolování výjimek a oznámení. Dále jste se dozvěděli o důležitosti bezpečných chybových zpráv.

Závěr série kurzů

Děkujeme za to, že sledujete. Doufám, že vám tato sada kurzů pomohla lépe se seznámit s ASP.NET Web Forms. Pokud potřebujete další informace o funkcích Web Forms dostupných ve verzích ASP.NET 4.5 a Visual Studio 2013, přečtěte si ASP.NET and Web Tools Visual Studio 2013 poznámky k verzi. Nezapomeňte se také podívat na kurz uvedený v části Další kroky a vyzkoušet bezplatnou zkušební verzi Azure.

Díky - Erik

Další kroky

Další informace o nasazení webové aplikace do Microsoft Azure najdete v tématu Nasazení zabezpečené aplikace ASP.NET Web Forms s členstvím, OAuth a SQL Database na web Azure.

Bezplatná zkušební verze

Microsoft Azure – bezplatná zkušební verze
Publikováním webu do Microsoft Azure ušetříte čas, údržbu a výdaje. Nasazení webové aplikace do Azure je rychlý proces. Pokud potřebujete webovou aplikaci udržovat a monitorovat, Azure nabízí celou řadu nástrojů a služeb. Správa dat, provozu, identit, záloh, zasílání zpráv, médií a výkonu v Azure A to vše je poskytováno ve velmi nákladově efektivním přístupu.

Další materiály

Protokolování podrobností o chybách pomocí monitorování stavu ASP.NET
ELMAH

Poděkování

Chtěl bych poděkovat následujícím lidem, kteří významně přispěli k obsahu této série kurzů:

Komunitní příspěvky