ASP.NET Hata İşleme
tarafından Erik Reitan
Wingtip Toys Örnek Proje (C#) veya E-kitabı İndir (PDF)
Bu öğretici serisi, web için ASP.NET 4.5 ve Microsoft Visual Studio Express 2013 kullanarak ASP.NET Web Forms uygulaması oluşturmanın temellerini öğretecektir. Bu öğretici serisine eşlik etmek için C# kaynak koduna sahip bir Visual Studio 2013 projesi kullanılabilir.
Bu öğreticide Wingtip Toys örnek uygulamasını hata işleme ve hata günlüğü içerecek şekilde değiştireceksiniz. Hata işleme, uygulamanın hataları düzgün bir şekilde işlemesine ve hata iletilerini uygun şekilde görüntülemesine olanak tanır. Hata günlüğü, oluşan hataları bulmanıza ve düzeltmenize olanak sağlar. Bu öğretici, önceki "URL Yönlendirme" öğreticisini oluşturur ve Wingtip Toys öğretici serisinin bir parçasıdır.
Öğrenecekleriniz:
- Uygulamanın yapılandırmasına genel hata işleme ekleme.
- Uygulama, sayfa ve kod düzeylerinde hata işleme ekleme.
- Hataları daha sonra gözden geçirmek için günlüğe kaydetme.
- Güvenliği tehlikeye atmayan hata iletilerini görüntüleme.
- Hata Günlüğü Modülleri ve İşleyicileri (ELMAH) hata günlüğünü uygulama.
Genel Bakış
ASP.NET uygulamaların tutarlı bir şekilde yürütme sırasında oluşan hataları işleyebilmesi gerekir. ASP.NET, uygulamalara hataları tekdüzen bir şekilde bildirmenin bir yolunu sağlayan ortak dil çalışma zamanını (CLR) kullanır. Hata oluştuğunda bir özel durum oluşur. Özel durum, bir uygulamanın karşılaştığı herhangi bir hata, koşul veya beklenmeyen davranıştır.
.NET Framework özel durum, sınıfından System.Exception
devralan bir nesnedir. Bir sorunun oluştuğu bir kod alanından özel durum oluşturulur. Özel durum, çağrı yığınına uygulamanın özel durumu işlemek için kod sağladığı bir yere geçirilir. Uygulama özel durumu işlemezse tarayıcı hata ayrıntılarını görüntülemeye zorlanır.
En iyi uygulama olarak, içindeki hataları kodunuzdaki bloklarda Try
//Catch
Finally
kod düzeyinde işleyin. Kullanıcının oluştuğu bağlamdaki sorunları düzeltebilmesi için bu blokları yerleştirmeyi deneyin. Hata işleme blokları hatanın oluştuğu yerden çok uzaktaysa, kullanıcılara sorunu çözmek için gereken bilgileri sağlamak zorlaşır.
Exception Sınıfı
Exception sınıfı, özel durumların devralındığı temel sınıftır. Özel durum nesnelerinin çoğu sınıf, IndexOutOfRangeException
sınıf veya sınıf gibi SystemException
Exception sınıfının türetilmiş bazı sınıf örnekleridirArgumentNullException
. Exception sınıfı, oluşan hata hakkında belirli bilgiler sağlayan özelliğiInnerException
, özelliği ve Message
özelliği gibi StackTrace
özelliklere sahiptir.
Özel Durum Devralma Hiyerarşisi
Çalışma zamanı, bir özel durumla karşılaşıldığında çalışma zamanının SystemException
oluşturduğunu sınıfından türetilen temel bir özel durum kümesine sahiptir. Sınıf ve sınıf gibi Exception sınıfından devralan sınıfların IndexOutOfRangeException
ArgumentNullException
çoğu ek üyeler uygulamaz. Bu nedenle, bir özel durum için en önemli bilgiler özel durum hiyerarşisinde, özel durum adında ve özel durumda yer alan bilgilerde bulunabilir.
Özel Durum İşleme Hiyerarşisi
ASP.NET Web Forms bir uygulamada özel durumlar belirli bir işleme hiyerarşisi temelinde işlenebilir. Bir özel durum aşağıdaki düzeylerde işlenebilir:
- Uygulama düzeyi
- Sayfa düzeyi
- Kod düzeyi
Bir uygulama özel durumları işlediğinde, Özel Durum sınıfından devralınan özel durum hakkında ek bilgiler genellikle alınabilir ve kullanıcıya görüntülenebilir. Uygulama, sayfa ve kod düzeyine ek olarak, HTTP modülü düzeyinde ve IIS özel işleyicisi kullanarak özel durumları da işleyebilirsiniz.
Uygulama Düzeyi Hata İşleme
Uygulamanızın yapılandırmasını değiştirerek veya uygulamanızın Global.asax dosyasına bir Application_Error
işleyici ekleyerek uygulama düzeyinde varsayılan hataları işleyebilirsiniz.
Web.config dosyasına bir customErrors
bölüm ekleyerek varsayılan hataları ve HTTP hatalarını işleyebilirsiniz. customErrors
bölümü, hata oluştuğunda kullanıcıların yönlendirileceği varsayılan bir sayfa belirtmenize olanak tanır. Ayrıca belirli durum kodu hataları için tek tek sayfalar belirtmenize de olanak tanır.
<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>
Ne yazık ki, kullanıcıyı farklı bir sayfaya yönlendirmek için yapılandırmayı kullandığınızda, oluşan hatanın ayrıntılarına sahip olmazsınız.
Ancak, Global.asax dosyasındaki işleyiciye kod ekleyerek uygulamanızın Application_Error
herhangi bir yerinde oluşan hataları yakalayabilirsiniz.
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);
}
}
Sayfa Düzeyi Hatası Olay İşleme
Sayfa düzeyi işleyici, kullanıcıyı hatanın oluştuğu sayfaya döndürür, ancak denetim örnekleri korunmadığından artık sayfada hiçbir şey olmayacaktır. Hata ayrıntılarını uygulamanın kullanıcısına sağlamak için hata ayrıntılarını özellikle sayfaya yazmanız gerekir.
Genellikle işlenmeyen hataları günlüğe kaydetmek veya kullanıcıyı yararlı bilgiler görüntüleyebilen bir sayfaya götürmek için sayfa düzeyi hata işleyicisi kullanırsınız.
Bu kod örneği, ASP.NET Web sayfasındaki Error olayının işleyicisini gösterir. Bu işleyici, sayfadaki bloklar içinde try
/catch
henüz işlenmeyen tüm özel durumları yakalar.
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();
}
Bir hatayı işledikten sonra, Sunucu nesnesinin ClearError
(HttpServerUtility
sınıfı) yöntemini çağırarak temizlemeniz gerekir, aksi takdirde daha önce oluşan bir hata görürsünüz.
Kod Düzeyi Hata İşleme
try-catch deyimi, farklı özel durumlar için işleyicileri belirten bir veya daha fazla catch yan tümcesinin ardından bir try bloğundan oluşur. Özel durum oluşturulduğunda, ortak dil çalışma zamanı (CLR) bu özel durumu işleyen catch deyimini arar. Şu anda yürütülen yöntem bir catch bloğu içermiyorsa, CLR geçerli yöntemi çağıran yönteme bakar ve çağrı yığınını yukarı doğru devam eder. Yakalama bloğu bulunmazsa, CLR kullanıcıya işlenmeyen bir özel durum iletisi görüntüler ve programın yürütülmesini durdurur.
Aşağıdaki kod örneği, hataları işlemek için kullanmanın try
//catch
finally
yaygın bir yolunu gösterir.
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();
}
}
Yukarıdaki kodda try bloğu, olası bir özel duruma karşı korunması gereken kodu içerir. Blok, bir özel durum oluşturulana veya blok başarıyla tamamlanana kadar yürütülür. Bir FileNotFoundException
özel durum veya özel IOException
durum oluşursa, yürütme farklı bir sayfaya aktarılır. Ardından, hata oluşup oluşmadığı fark etmeksizin finally bloğunda yer alan kod yürütülür.
Hata Günlüğü Desteği Ekleniyor
Wingtip Toys örnek uygulamasına hata işleme eklemeden önce Logic klasörüne bir ExceptionUtility
sınıf ekleyerek hata günlüğü desteği ekleyeceksiniz. Bunu yaptığınızda, uygulama her hata işlediğinde hata ayrıntıları hata günlüğü dosyasına eklenir.
Mantıksal klasöre sağ tıklayın ve ekle ->Yeni Öğe'yi seçin.
Yeni Öğe Ekle iletişim kutusu görüntülenir.Soldaki Visual C# ->Code şablonları grubunu seçin. Ardından ortadaki listeden Sınıf'ıseçin ve ExceptionUtility.cs olarak adlandırın.
Ekle'yi seçin. Yeni sınıf dosyası görüntülenir.
Mevcut kodu aşağıdakilerle değiştirin:
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(); } } }
Bir özel durum oluştuğunda, yöntemi çağrılarak LogException
özel durum günlük dosyasına yazılabilir. Bu yöntem, özel durum nesnesi ve özel durumun kaynağıyla ilgili ayrıntıları içeren bir dize olmak üzere iki parametre alır. Özel durum günlüğü, App_Data klasöründeki ErrorLog.txt dosyasına yazılır.
Hata Sayfası Ekleme
Wingtip Toys örnek uygulamasında, hataları görüntülemek için bir sayfa kullanılacaktır. Hata sayfası, sitenin kullanıcılarına güvenli bir hata iletisi gösterecek şekilde tasarlanmıştır. Ancak, kullanıcı kodun bulunduğu makinede yerel olarak sunulan bir HTTP isteğinde bulunan bir geliştiriciyse, hata sayfasında ek hata ayrıntıları görüntülenir.
Çözüm Gezgini proje adına (Wingtip Toys) sağ tıklayın ve Ekle ->Yeni Öğe'yi seçin .
Yeni Öğe Ekle iletişim kutusu görüntülenir.Soldaki Visual C# ->Web şablonları grubunu seçin. Ortadaki listeden Ana Sayfalı Web Formu'nu seçin ve ErrorPage.aspx olarak adlandırın.
Ekle'ye tıklayın.
Ana sayfa olarak Site.Master dosyasını seçin ve ardından Tamam'ı seçin.
Mevcut işaretlemeyi aşağıdakilerle değiştirin:
<%@ 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>
Arka planda kodun mevcut kodunu (ErrorPage.aspx.cs) aşağıdaki gibi görünecek şekilde değiştirin:
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(); } } }
Hata sayfası görüntülendiğinde olay Page_Load
işleyicisi yürütülür. İşleyicide Page_Load
, hatanın ilk işlendiği konum belirlenir. Ardından, oluşan son hata Sunucu nesnesinin GetLastError
yöntemini çağırarak belirlenir. Özel durum artık yoksa genel bir özel durum oluşturulur. Ardından HTTP isteği yerel olarak yapıldıysa tüm hata ayrıntıları gösterilir. Bu durumda, bu hata ayrıntılarını yalnızca web uygulamasını çalıştıran yerel makine görür. Hata bilgileri görüntülendikten sonra hata günlük dosyasına eklenir ve hata sunucudan temizlenir.
Uygulama için İşlenmeyen Hata İletilerini Görüntüleme
Web.config dosyasına bir customErrors
bölüm ekleyerek, uygulama genelinde oluşan basit hataları hızla işleyebilirsiniz. Ayrıca, 404 - Dosya bulunamadı gibi durum kodu değerlerine göre hataların nasıl işleneceğini de belirtebilirsiniz.
Yapılandırmayı Güncelleştirme
Web.config dosyasına bir customErrors
bölüm ekleyerek yapılandırmayı güncelleştirin.
Çözüm Gezgini'da Wingtip Toys örnek uygulamasının kökündeki Web.config dosyasını bulun ve açın.
customErrors
bölümünü düğümdeki<system.web>
Web.config dosyasına aşağıdaki gibi ekleyin:<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>
Web.config dosyasını kaydedin.
customErrors
bölümü modu belirtir ve bu mod "Açık" olarak ayarlanır. Ayrıca, bir hata oluştuğunda defaultRedirect
uygulamaya hangi sayfaya gidebileceğinizi bildiren öğesini de belirtir. Ayrıca, bir sayfa bulunamadığında 404 hatasını işlemeyi belirten belirli bir hata öğesi eklediniz. Bu öğreticinin ilerleyen bölümlerinde, uygulama düzeyinde bir hatanın ayrıntılarını yakalayacak ek hata işlemesi ekleyeceksiniz.
Uygulamayı Çalıştırma
Güncelleştirilmiş yolları görmek için uygulamayı şimdi çalıştırabilirsiniz.
Wingtip Toys örnek uygulamasını çalıştırmak için F5 tuşuna basın.
Tarayıcı açılır ve Default.aspx sayfasını gösterir.Tarayıcıya aşağıdaki URL'yi girin (bağlantı noktası numaranızı kullandığınızdan emin olun):
https://localhost:44300/NoPage.aspx
Tarayıcıda görüntülenen ErrorPage.aspx dosyasını gözden geçirin.
Mevcut olmayan NoPage.aspx sayfasını istediğinizde, ek ayrıntılar varsa hata sayfası basit hata iletisini ve ayrıntılı hata bilgilerini gösterir. Ancak, kullanıcı uzak bir konumdan varolmayan bir sayfa isterse, hata sayfası yalnızca kırmızı renkli hata iletisini gösterir.
Test Amacıyla Özel Durum Ekleme
Hata oluştuğunda uygulamanızın nasıl çalışacağını doğrulamak için, ASP.NET'da kasıtlı olarak hata koşulları oluşturabilirsiniz. Wingtip Toys örnek uygulamasında, ne olduğunu görmek için varsayılan sayfa yüklendiğinde bir test özel durumu oluşturacaksınız.
Visual Studio'da Default.aspx sayfasının arka planındaki kodu açın.
Default.aspx.cs arka planda kod sayfası görüntülenir.İşleyicide
Page_Load
, işleyicinin aşağıdaki gibi görünmesi için kod ekleyin:protected void Page_Load(object sender, EventArgs e) { throw new InvalidOperationException("An InvalidOperationException " + "occurred in the Page_Load handler on the Default.aspx page."); }
Çeşitli özel durum türleri oluşturmak mümkündür. Yukarıdaki kodda, Default.aspx sayfası yüklendiğinde bir InvalidOperationException
oluşturursunuz.
Uygulamayı Çalıştırma
Uygulamanın özel durumu nasıl işlediğini görmek için uygulamayı çalıştırabilirsiniz.
Wingtip Toys örnek uygulamasını çalıştırmak için CTRL+F5 tuşlarına basın.
Uygulama InvalidOperationException oluşturur.Not
Visual Studio'da hatanın kaynağını görüntülemek üzere koda girmeden sayfayı görüntülemek için CTRL+F5 tuşlarına basmanız gerekir.
Tarayıcıda görüntülenen ErrorPage.aspx dosyasını gözden geçirin.
Hata ayrıntılarında görebileceğiniz gibi, özel durum Web.config dosyasındaki bölüm tarafından customError
tuzağa düşürüldü.
Application-Level Hata İşleme ekleme
Özel durum hakkında çok az bilgi edindiğiniz Web.config dosyasındaki bölümünü kullanarak customErrors
özel durumu yakalamak yerine, hatayı uygulama düzeyinde yakalayabilir ve hata ayrıntılarını alabilirsiniz.
Çözüm Gezgini'daGlobal.asax.cs dosyasını bulun ve açın.
Aşağıdaki gibi görünmesi için bir Application_Error işleyicisi ekleyin:
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); } } }
Uygulamada bir hata oluştuğunda işleyici Application_Error
çağrılır. Bu işleyicide son özel durum alınır ve gözden geçirilir. Özel durum işlenmemişse ve özel durum iç özel durum ayrıntılarını içeriyorsa (yani InnerException
null değilse), uygulama yürütmeyi özel durum ayrıntılarının görüntülendiği hata sayfasına aktarır.
Uygulamayı Çalıştırma
Uygulama düzeyinde özel durumu işleyerek sağlanan ek hata ayrıntılarını görmek için uygulamayı çalıştırabilirsiniz.
Wingtip Toys örnek uygulamasını çalıştırmak için CTRL+F5 tuşlarına basın.
Uygulama oluştururInvalidOperationException
.Tarayıcıda görüntülenen ErrorPage.aspx dosyasını gözden geçirin.
Page-Level Hata İşleme ekleme
Sayfa yönergesine bir ErrorPage
öznitelik ekleyerek veya bir sayfanın arkasındaki koda @Page
bir Page_Error
olay işleyicisi ekleyerek sayfaya sayfa düzeyinde hata işleme ekleyebilirsiniz. Bu bölümde, yürütmeyi ErrorPage.aspx sayfasına aktaracak bir Page_Error
olay işleyicisi ekleyeceğiz.
Çözüm Gezgini'daDefault.aspx.cs dosyasını bulun ve açın.
Arka planda kodun aşağıdaki gibi görünmesi için bir
Page_Error
işleyici ekleyin: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); } } } }
Sayfada bir hata oluştuğunda, Page_Error
olay işleyicisi çağrılır. Bu işleyicide son özel durum alınır ve gözden geçirilir. Oluşursa InvalidOperationException
, Page_Error
olay işleyicisi yürütmeyi özel durum ayrıntılarının görüntülendiği hata sayfasına aktarır.
Uygulamayı Çalıştırma
Güncelleştirilmiş yolları görmek için uygulamayı şimdi çalıştırabilirsiniz.
Wingtip Toys örnek uygulamasını çalıştırmak için CTRL+F5 tuşlarına basın.
Uygulama oluştururInvalidOperationException
.Tarayıcıda görüntülenen ErrorPage.aspx dosyasını gözden geçirin.
Tarayıcı pencerenizi kapatın.
Test için Kullanılan Özel Durumu Kaldırma
Wingtip Toys örnek uygulamasının bu öğreticide daha önce eklediğiniz özel durumu oluşturmadan çalışmasına izin vermek için özel durumu kaldırın.
Default.aspx sayfasının arka planındaki kodu açın.
İşleyicide
Page_Load
, işleyicinin aşağıdaki gibi görünmesi için özel durum oluşturan kodu kaldırın:protected void Page_Load(object sender, EventArgs e) { }
Code-Level Hata Günlüğü Ekleme
Bu öğreticide daha önce belirtildiği gibi, kodun bir bölümünü çalıştırmayı ve oluşan ilk hatayı işlemeyi denemek için try/catch deyimleri ekleyebilirsiniz. Bu örnekte, hatanın daha sonra gözden geçirilebilmesi için hata ayrıntılarını yalnızca hata günlük dosyasına yazacaksınız.
Çözüm Gezgini,Logic klasöründe PayPalFunctions.cs dosyasını bulun ve açın.
Kodun
HttpCall
aşağıdaki gibi görünmesi için yöntemini güncelleştirin: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; }
Yukarıdaki kod, sınıfında yer alan ExceptionUtility
yöntemini çağırırLogException
. Bu öğreticinin önceki bölümlerinde Logic klasörüne ExceptionUtility.cs sınıf dosyasını eklediniz. LogException
yöntemi iki parametre alır. İlk parametre özel durum nesnesidir. İkinci parametre, hatanın kaynağını tanımak için kullanılan bir dizedir.
Hata Günlüğü Bilgilerini İnceleme
Daha önce belirtildiği gibi, hata günlüğünü kullanarak uygulamanızdaki hangi hataların önce düzeltilmesi gerektiğini belirleyebilirsiniz. Elbette, yalnızca tuzağa düşürülen ve hata günlüğüne yazılan hatalar kaydedilir.
Çözüm Gezgini'da App_Data klasöründekiErrorLog.txt dosyasını bulun ve açın.
ErrorLog.txt dosyasını görmek için Çözüm Gezgini üst kısmındaki "Tüm Dosyaları Göster" seçeneğini veya "Yenile" seçeneğini belirlemeniz gerekebilir.Visual Studio'da görüntülenen hata günlüğünü gözden geçirin:
Güvenli Hata İletileri
Uygulamanız hata iletileri görüntülendiğinde, kötü amaçlı bir kullanıcının uygulamanıza saldırmada yararlı bulabileceği bilgileri vermemesi gerektiğini unutmayın . Örneğin, uygulamanız bir veritabanına yazmayı başarısız bir şekilde denerse, kullandığı kullanıcı adını içeren bir hata iletisi görüntülememelidir. Bu nedenle, kullanıcıya kırmızı renkli genel bir hata iletisi görüntülenir. Tüm ek hata ayrıntıları yalnızca yerel makinede geliştiriciye görüntülenir.
ELMAH kullanma
ELMAH (Hata Günlüğü Modülleri ve İşleyicileri), ASP.NET uygulamanıza NuGet paketi olarak eklediğiniz bir hata günlüğü özelliğidir. ELMAH aşağıdaki özellikleri sağlar:
- İşlenmeyen özel durumların günlüğe kaydedilmesi.
- Yeniden kodlanmış işlenmeyen özel durumların günlüğünün tamamını görüntülemek için bir web sayfası.
- Günlüğe kaydedilen her özel durumun tüm ayrıntılarını görüntülemek için bir web sayfası.
- Her hata oluştuğunda oluşan bir e-posta bildirimi.
- Günlükten son 15 hatanın RSS akışı.
ELMAH ile çalışabilmeniz için önce yüklemeniz gerekir. NuGet paket yükleyicisini kullanmak kolaydır. Bu öğretici serisinin önceki bölümlerinde belirtildiği gibi NuGet, Visual Studio'da açık kaynak kitaplıkları ve araçları yüklemeyi ve güncelleştirmeyi kolaylaştıran bir Visual Studio uzantısıdır.
Visual Studio'da Araçlarmenüsünden NuGet Paket Yöneticisi>Çözüm için NuGet Paketlerini Yönet'i seçin.
NuGet Paketlerini Yönet iletişim kutusu Visual Studio'da görüntülenir.
NuGet Paketlerini Yönet iletişim kutusunda, soldaki Çevrimiçi'ni genişletin ve nuget.org'ı seçin. Ardından, elmah paketini çevrimiçi kullanılabilir paketler listesinden bulup yükleyin.
Paketi indirmek için İnternet bağlantınız olması gerekir.
Proje Seç iletişim kutusunda WingtipToys seçiminin seçili olduğundan emin olun ve tamam'a tıklayın.
Gerekirse NuGet Paketlerini Yönet iletişim kutusunda Kapat'a tıklayın.
Visual Studio açık dosyaları yeniden yüklemenizi isterse "Tümüne Evet" seçeneğini belirleyin.
ELMAH paketi, projenizin kökündeki Web.config dosyasına kendisi için girdiler ekler. Visual Studio değiştirilmiş Web.config dosyasını yeniden yüklemek isteyip istemediğinizi sorarsa Evet'e tıklayın.
ELMAH artık ortaya çıkan işlenmeyen hataları depolamaya hazırdır.
ELMAH Günlüğünü Görüntüleme
ELMAH günlüğünü görüntülemek kolaydır, ancak önce ELMAH günlüğüne kaydedilecek işlenmemiş bir özel durum oluşturacaksınız.
Wingtip Toys örnek uygulamasını çalıştırmak için CTRL+F5 tuşlarına basın.
ELMAH günlüğüne işlenmeyen bir özel durum yazmak için tarayıcınızda şu URL'ye gidin (bağlantı noktası numaranızı kullanarak):
https://localhost:44300/NoPage.aspx
Hata sayfası görüntülenir.ELMAH günlüğünü görüntülemek için tarayıcınızda şu URL'ye gidin (bağlantı noktası numaranızı kullanarak):
https://localhost:44300/elmah.axd
Özet
Bu öğreticide uygulama düzeyinde, sayfa düzeyinde ve kod düzeyinde hataları işleme hakkında bilgi edindiniz. İşlenen ve işlenmeyen hataları daha sonra gözden geçirmek üzere günlüğe kaydetmeyi de öğrendiniz. NuGet kullanarak uygulamanıza özel durum günlüğü ve bildirim sağlamak için ELMAH yardımcı programını eklediniz. Ayrıca, güvenli hata iletilerinin önemini öğrendiniz.
Öğretici Serisi Sonucu
Birlikte geldiğiniz için teşekkürler. Umarım bu öğretici kümesi ASP.NET Web Forms hakkında daha fazla bilgi sahibi olmanıza yardımcı olmuştur. ASP.NET 4.5 ve Visual Studio 2013'da bulunan Web Forms özellikleri hakkında daha fazla bilgiye ihtiyacınız varsa bkz. Visual Studio 2013 Sürüm Notları için ASP.NET and Web Tools. Ayrıca , Sonraki Adımlar bölümünde belirtilen öğreticiye göz atmayı ve ücretsiz Azure deneme sürümünü kesinlikle denemeyi unutmayın.
Sonraki Adımlar
Web uygulamanızı Microsoft Azure'a dağıtma hakkında daha fazla bilgi edinmek için bkz. Azure Web Sitesine Üyelik, OAuth ve SQL Veritabanı ile Güvenli ASP.NET Web Forms Uygulaması Dağıtma.
Ücretsiz Deneme
Microsoft Azure - Ücretsiz Deneme
Web sitenizi Microsoft Azure'da yayımlamak size zaman, bakım ve masraf tasarrufu sağlar. Web uygulamanızı Azure'a dağıtmak için hızlı bir işlemdir. Web uygulamanızın bakımını yapmanız ve izlemeniz gerektiğinde, Azure çeşitli araçlar ve hizmetler sunar. Azure'da verileri, trafiği, kimliği, yedeklemeleri, mesajlaşmayı, medyayı ve performansı yönetin. Ve tüm bunlar çok uygun maliyetli bir yaklaşımla sağlanır.
Ek Kaynaklar
ASP.NET Sistem Durumu İzleme ile Hata Ayrıntılarını Günlüğe Kaydetme
ELMAH
Teşekkürler
Bu öğretici serisinin içeriğine önemli katkılarda bulunan aşağıdaki kişilere teşekkür etmek istiyorum:
- Alberto Poblacion, MVP & MCT, İspanya
- Alex Thissen, Hollanda (twitter: @alexthissen)
- Andre Tournier, ABD
- Apurva Joshi, Microsoft
- Bojan Vrhovnik, Slovenya
- Bruno Sonnino, Brezilya (twitter: @bsonnino)
- Carlos dos Santos, Brezilya
- Dave Campbell, ABD (twitter: @windowsdevnews)
- Jon Galloway, Microsoft (twitter: @jongalloway)
- Michael Sharps, ABD (twitter: @mrsharps)
- Mike Pope
- Mitchel Sellers, ABD (twitter: @MitchelSellers)
- Paul Cociuba, Microsoft
- Paulo Morgado, Portekiz
- Pranav Rastogi, Microsoft
- Tim Ammann, Microsoft
- Tom Dykstra, Microsoft
Topluluk Katkıları
- Graham Mendick (@grahammendick)
MSDN'de Visual Studio 2012 ile ilgili kod örneği: Navigation Wingtip Toys - James Chaney (jchaney@agvance.net)
MSDN'de Visual Studio 2012 ile ilgili kod örneği: Visual Basic'te ASP.NET 4.5 Web Forms Öğretici Serisi - Andrielle Azevedo - Microsoft Teknik Hedef Kitle Katkıda Bulunanı (twitter: @driazevedo)
Visual Studio 2012 çevirisi: Iniciando com ASP.NET Web Forms 4.5 - Parte 1 - Introdução e Visão Geral