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//CatchFinally 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 IndexOutOfRangeExceptionArgumentNullException ç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&amp;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//catchfinally 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.

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

  2. Soldaki Visual C# ->Code şablonları grubunu seçin. Ardından ortadaki listeden Sınıf'ıseçin ve ExceptionUtility.cs olarak adlandırın.

  3. Ekle'yi seçin. Yeni sınıf dosyası görüntülenir.

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

  1. Çö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.

  2. Soldaki Visual C# ->Web şablonları grubunu seçin. Ortadaki listeden Ana Sayfalı Web Formu'nu seçin ve ErrorPage.aspx olarak adlandırın.

  3. Ekle'ye tıklayın.

  4. Ana sayfa olarak Site.Master dosyasını seçin ve ardından Tamam'ı seçin.

  5. 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>&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. 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.

  1. Çözüm Gezgini'da Wingtip Toys örnek uygulamasının kökündeki Web.config dosyasını bulun ve açın.

  2. 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&amp;handler=customErrors%20section%20-%20Web.config"/>
        </customErrors>
      </system.web>
    </configuration>
    
  3. 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 defaultRedirectuygulamaya 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.

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

  2. Tarayıcıya aşağıdaki URL'yi girin (bağlantı noktası numaranızı kullandığınızdan emin olun):
    https://localhost:44300/NoPage.aspx

  3. Tarayıcıda görüntülenen ErrorPage.aspx dosyasını gözden geçirin.

    ASP.NET Hata İşleme - Sayfa Bulunamadı Hatası

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.

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

  2. İş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.

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

  2. Tarayıcıda görüntülenen ErrorPage.aspx dosyasını gözden geçirin.

    ASP.NET Hata İşleme - Hata Sayfası

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.

  1. Çözüm Gezgini'daGlobal.asax.cs dosyasını bulun ve açın.

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

  1. Wingtip Toys örnek uygulamasını çalıştırmak için CTRL+F5 tuşlarına basın.
    Uygulama oluşturur InvalidOperationException .

  2. Tarayıcıda görüntülenen ErrorPage.aspx dosyasını gözden geçirin.

    ASP.NET Hata İşleme - Uygulama Düzeyi Hatası

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.

  1. Çözüm Gezgini'daDefault.aspx.cs dosyasını bulun ve açın.

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

  1. Wingtip Toys örnek uygulamasını çalıştırmak için CTRL+F5 tuşlarına basın.
    Uygulama oluşturur InvalidOperationException .

  2. Tarayıcıda görüntülenen ErrorPage.aspx dosyasını gözden geçirin.

    ASP.NET Hata İşleme - Sayfa Düzeyi Hatası

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

  1. Default.aspx sayfasının arka planındaki kodu açın.

  2. İş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.

  1. Çözüm Gezgini,Logic klasöründe PayPalFunctions.cs dosyasını bulun ve açın.

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

  1. Çö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.

  2. Visual Studio'da görüntülenen hata günlüğünü gözden geçirin:

    ASP.NET Hata İşleme - ErrorLog.txt

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.

  1. Visual Studio'da Araçlarmenüsünden NuGet Paket Yöneticisi>Çözüm için NuGet Paketlerini Yönet'i seçin.

    ASP.NET Hata İşleme - Çözüm için NuGet Paketlerini Yönetme

  2. NuGet Paketlerini Yönet iletişim kutusu Visual Studio'da görüntülenir.

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

    ASP.NET Hata İşleme - ELMA NuGet Paketi

  4. Paketi indirmek için İnternet bağlantınız olması gerekir.

  5. Proje Seç iletişim kutusunda WingtipToys seçiminin seçili olduğundan emin olun ve tamam'a tıklayın.

    ASP.NET Hata İşleme - Projeleri Seç İletişim Kutusu

  6. Gerekirse NuGet Paketlerini Yönet iletişim kutusunda Kapat'a tıklayın.

  7. Visual Studio açık dosyaları yeniden yüklemenizi isterse "Tümüne Evet" seçeneğini belirleyin.

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

  1. Wingtip Toys örnek uygulamasını çalıştırmak için CTRL+F5 tuşlarına basın.

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

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

    ASP.NET Hata İşleme - ELMAH Hata Günlüğü

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

Teşekkürler - Erik

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:

Topluluk Katkıları