Zpracování chyb v ASP.NET
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
//Catch
Finally
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&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
//catch
finally
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.
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.Na levé straně vyberte skupinu Šablony Visual C# ->Code . Potom v prostředním seznamu vyberte Třídaa pojmenujte ji ExceptionUtility.cs.
Zvolte Přidat. Zobrazí se nový soubor třídy.
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ě.
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.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.
Klikněte na Přidat.
Jako stránku předlohy vyberte soubor Site.Master a pak zvolte OK.
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> </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>
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 .
V Průzkumník řešení vyhledejte a otevřete souborWeb.config v kořenovém adresáři ukázkové aplikace Wingtip Toys.
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&handler=customErrors%20section%20-%20Web.config"/> </customErrors> </system.web> </configuration>
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.
Stisknutím klávesy F5 spusťte ukázkovou aplikaci Wingtip Toys.
Otevře se prohlížeč a zobrazí stránku Default.aspx .Do prohlížeče zadejte následující adresu URL (nezapomeňte použít číslo portu):
https://localhost:44300/NoPage.aspx
Zkontrolujte soubor ErrorPage.aspx zobrazený v prohlížeči.
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.
Otevřete kód na pozadí stránky Default.aspx v sadě Visual Studio.
Zobrazí se stránka s kódem Default.aspx.cs .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.
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.
Zkontrolujte soubor ErrorPage.aspx zobrazený v prohlížeči.
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ě.
V Průzkumník řešení vyhledejte a otevřete soubor Global.asax.cs.
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.
Stisknutím kombinace kláves CTRL+F5 spusťte ukázkovou aplikaci Wingtip Toys.
Aplikace vyvolá .InvalidOperationException
Zkontrolujte soubor ErrorPage.aspx zobrazený v prohlížeči.
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 .
V Průzkumník řešení vyhledejte a otevřete soubor Default.aspx.cs.
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.
Stisknutím kombinace kláves CTRL+F5 spusťte ukázkovou aplikaci Wingtip Toys.
Aplikace vyvolá .InvalidOperationException
Zkontrolujte soubor ErrorPage.aspx zobrazený v prohlížeči.
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.
Otevřete kód na pozadí stránky Default.aspx .
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.
V Průzkumník řešení ve složce Logika najděte a otevřete soubor PayPalFunctions.cs.
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.
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.Zkontrolujte protokol chyb zobrazený v sadě Visual Studio:
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.
V sadě Visual Studio v nabídce Nástroje vyberte Správce> balíčků NuGetSpravovat balíčky NuGet pro řešení.
V sadě Visual Studio se zobrazí dialogové okno Spravovat balíčky NuGet .
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.
Ke stažení balíčku budete muset mít připojení k internetu.
V dialogovém okně Vybrat projekty se ujistěte, že je vybraná možnost WingtipToys , a klikněte na OK.
V případě potřeby klikněte v dialogovém okně Spravovat balíčky NuGet na Zavřít.
Pokud Visual Studio požádá o opětovné načtení všech otevřených souborů, vyberte Možnost Ano všem.
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.
Stisknutím kombinace kláves CTRL+F5 spusťte ukázkovou aplikaci Wingtip Toys.
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.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
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.
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ů:
- Alberto Poblacion, MVP & MCT, Španělsko
- Alex Thissen, Nizozemsko (twitter: @alexthissen)
- Andre Tournier, USA
- Apurva Joshi, Microsoft
- Bojan Vrhovnik, Slovinsko
- Bruno Sonnino, Brazílie (twitter: @bsonnino)
- Carlos dos Santos, Brazílie
- Dave Campbell, USA (twitter: @windowsdevnews)
- Jon Galloway, Microsoft (twitter: @jongalloway)
- Michael Sharps, USA (twitter: @mrsharps)
- Mike Pope
- Mitchel Sellers, USA (twitter: @MitchelSellers)
- Paul Cociuba, Microsoft
- Paulo Morgado, Portugalsko
- Pranav Rastogi, Microsoft
- Tim Ammann, Microsoft
- Tom Dykstra, Microsoft
Komunitní příspěvky
- Graham Mendick (@grahammendick)
Ukázka kódu souvisejícího se sadou Visual Studio 2012 na webu MSDN: Navigation Wingtip Toys - James Chaney (jchaney@agvance.net)
Ukázka kódu souvisejícího se sadou Visual Studio 2012 na webu MSDN: ASP.NET 4.5 Web Forms Tutorial Series v jazyce Visual Basic - Andrielle Azevedo – přispěvatel technické cílové skupiny Microsoftu (twitter: @driazevedo)
Překlad sady Visual Studio 2012: Iniciando com ASP.NET Web Forms 4.5 - Parte 1 - Introdução e Visão Geral