обработка ошибок ASP.NET

Эрик Рейтан

Скачайте пример проекта Wingtip Toys (C#) или скачайте электронную книгу (PDF)

В этой серии учебников вы узнаете, как создавать приложение веб-форм ASP.NET с помощью ASP.NET 4.5 и Microsoft Visual Studio Express 2013 для Интернета. Проект Visual Studio 2013 с исходным кодом C# доступен для сопровождения этой серии учебников.

В этом руководстве вы измените пример приложения Wingtip Toys, чтобы включить обработку ошибок и ведение журнала ошибок. Обработка ошибок позволит приложению корректно обрабатывать ошибки и отображать сообщения об ошибках соответствующим образом. Ведение журнала ошибок позволяет находить и устранять ошибки, которые произошли. В этом руководстве описано предыдущее руководство по маршрутизации URL-адресов и является частью серии учебников Wingtip Toys.

Что вы узнаете:

  • Как добавить глобальную обработку ошибок в конфигурацию приложения.
  • Как добавить обработку ошибок на уровне приложения, страницы и кода.
  • Как регистрировать ошибки для последующей проверки.
  • Как отображать сообщения об ошибках, которые не компрометируют безопасность.
  • Как реализовать модули и обработчики ведения журнала ошибок (ELMAH).

Обзор

ASP.NET приложения должны иметь возможность обрабатывать ошибки, возникающие во время выполнения согласованно. ASP.NET использует среду CLR, которая обеспечивает единый способ уведомления приложений об ошибках. При возникновении ошибки выбрасывается исключение. Исключением является любая ошибка, условие или непредвиденное поведение приложения.

В .NET Framework исключение — это объект, наследуемый от System.Exception класса. Исключение генерируется из блока кода, в котором возникла проблема. Исключение передается в стек вызовов в место, где приложение предоставляет код для обработки исключения. Если приложение не обрабатывает исключение, браузер вынужден отображать сведения об ошибке.

Правильной практикой является обработка ошибок на уровне кода в Try/Catch/Finally блоках в коде. Попробуйте разместить эти блоки, чтобы пользователь смог исправить проблемы в контексте, в котором они происходят. Если блоки обработки ошибок находятся слишком далеко от места возникновения ошибки, становится сложнее предоставить пользователям сведения, необходимые для устранения проблемы.

Класс исключений

Класс Exception — это базовый класс, из которого наследуются исключения. Большинство объектов исключений — это экземпляры определенного производного класса класса Exception, например SystemException класса, IndexOutOfRangeException класса или ArgumentNullException класса. Класс Exception имеет свойства, такие как StackTrace свойство, InnerException свойство и Message свойство, предоставляющие конкретные сведения об ошибке, которая произошла.

Иерархия наследования исключений

Среда выполнения имеет базовый набор исключений, производных от SystemException класса, вызываемого средой выполнения при обнаружении исключения. Большинство классов, наследуемых от класса Exception, таких как IndexOutOfRangeException класс и ArgumentNullException класс, не реализуют дополнительные члены. Поэтому наиболее важные сведения об исключении можно найти в иерархии исключений, имени исключения и информации, содержащейся в исключении.

Иерархия обработки исключений

В приложении веб-форм ASP.NET исключения можно обрабатывать на основе определенной иерархии обработки. Исключение можно обрабатывать на следующих уровнях:

  • Уровень приложения
  • Уровень страницы
  • Уровень кода

Когда приложение обрабатывает исключения, дополнительные сведения об исключении, наследуемом из класса Exception, часто можно получить и отобразить пользователю. Помимо приложения, страницы и уровня кода, можно также обрабатывать исключения на уровне модуля HTTP и с помощью пользовательского обработчика IIS.

Обработка ошибок на уровне приложения

Ошибки по умолчанию можно обрабатывать на уровне приложения, изменив конфигурацию приложения или добавив Application_Error обработчик в файл Global.asax приложения.

Ошибки по умолчанию и ошибки HTTP можно обрабатывать, добавив customErrors раздел в файл Web.config . В customErrors этом разделе можно указать страницу по умолчанию, на которую будут перенаправлены пользователи при возникновении ошибки. Он также позволяет указать отдельные страницы для определенных ошибок кода состояния.

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

К сожалению, при использовании конфигурации для перенаправления пользователя на другую страницу у вас нет сведений об ошибке, которая произошла.

Однако ошибки, возникающие в любой части вашего приложения, можно перехватить, добавив код в обработчик Application_Error в файле 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);
    }
}

Обработка событий ошибок уровня страницы

Обработчик уровня страницы возвращает пользователя на страницу, на которой произошла ошибка, но поскольку объекты управления не поддерживаются, страница будет пустой. Чтобы предоставить пользователю приложения сведения об ошибке, необходимо специально записать сведения об ошибке на страницу.

Обычно обработчик ошибок на уровне страницы используется для регистрации необработанных ошибок или отправки пользователя на страницу, которая может отображать полезные сведения.

В этом примере кода показан обработчик события Error на веб-странице ASP.NET. Этот обработчик перехватывает все исключения, которые еще не обрабатываются в try/catch блоках на странице.

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

После обработки ошибки необходимо очистить его путем вызова ClearError метода объекта Server (HttpServerUtility класса), в противном случае вы увидите ошибку, которая ранее произошла.

Обработка ошибок уровня кода

Оператор try-catch состоит из блока try, за которым следует одна или несколько клауз catch, которые указывают обработчики для разных исключений. При возникновении исключения среда CLR ищет инструкцию catch, обрабатывающую это исключение. Если текущий выполняемый метод не содержит блок catch, среда CLR рассматривает метод, вызывающий текущий метод и т. д., вверх по стеку вызовов. Если блок catch не найден, среда CLR отображает необработанное сообщение об исключении пользователю и останавливает выполнение программы.

В следующем примере кода показан распространенный способ try/catch/finally обработки ошибок.

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

В приведенном выше коде блок try содержит код, который необходимо защитить от возможного исключения. Блок выполняется до тех пор, пока не возникнет исключение или блок не будет успешно завершён. Если возникает исключение FileNotFoundException или исключение IOException, то выполнение передается на другую страницу. Затем выполняется код, содержащийся в блоке finally, независимо от того, возникла ли ошибка.

Добавление поддержки ведения журнала ошибок

Перед добавлением обработки ошибок в пример приложения Wingtip Toys вы добавите поддержку ведения журнала ошибок, добавив ExceptionUtility класс в папку логики . При этом каждый раз, когда приложение обрабатывает ошибку, сведения об ошибке будут добавлены в файл журнала ошибок.

  1. Щелкните правой кнопкой мыши папку логики и выберите "Добавить ->Создать элемент".
    Откроется диалоговое окно Добавление нового элемента .

  2. Выберите группу шаблонов Visual C# ->Code слева. Затем выберите классиз среднего списка и назовите его ExceptionUtility.cs.

  3. Нажмите кнопку Добавить. Отображается новый файл класса.

  4. Замените существующий код следующим кодом:

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

При возникновении исключения исключение можно записать в файл журнала исключений, вызвав LogException метод. Этот метод принимает два параметра, объект исключения и строку, содержащую сведения об источнике исключения. Журнал исключений записывается в файл ErrorLog.txt в папке App_Data .

Добавление страницы ошибок

В примере приложения Wingtip Toys одна страница будет использоваться для отображения ошибок. Страница ошибок предназначена для отображения безопасного сообщения об ошибке пользователям сайта. Однако если пользователь является разработчиком, выполняющим HTTP-запрос, который обслуживается локально на компьютере, где находится код, на странице ошибки будут отображаться дополнительные сведения об ошибке.

  1. Щелкните правой кнопкой мыши имя проекта (Wingtip Toys) в обозревателе решений и выберите "Добавить ->Новый элемент".
    Откроется диалоговое окно Добавление нового элемента .

  2. Выберите группу шаблонов Visual C# ->Web слева. В среднем списке выберите веб-форму с главной страницей и назовите ее ErrorPage.aspx.

  3. Нажмите кнопку Добавить.

  4. Выберите файл Site.Master в качестве главной страницы и нажмите кнопку "ОК".

  5. Замените существующую разметку следующим образом:

    <%@ 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. Замените существующий код (ErrorPage.aspx.cs), чтобы он отображался следующим образом:

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

При отображении страницы ошибки обработчик событий Page_Load выполняется. В обработчике Page_Load определяется местоположение, где ошибка была впервые обработана. Затем последняя ошибка, которая произошла, определяется путем вызова GetLastError метода объекта Server. Если исключение больше не существует, создается универсальное исключение. Затем, если HTTP-запрос был выполнен локально, отображаются все сведения об ошибке. В этом случае только локальный компьютер, на котором запущено веб-приложение, увидит эти сведения об ошибке. После отображения сведений об ошибке в файл журнала добавляется ошибка, а ошибка удаляется с сервера.

Отображение необработанных сообщений об ошибках для приложения

Добавив раздел в customErrors файл Web.config , вы можете быстро обрабатывать простые ошибки, возникающие во всем приложении. Вы также можете указать, как обрабатывать ошибки на основе значения кода состояния, например 404 — файл не найден.

Обновление конфигурации

Обновите конфигурацию, добавив customErrors раздел в файл Web.config .

  1. В обозревателе решений найдите и откройте файл Web.config в корне примера приложения Wingtip Toys.

  2. Добавьте раздел customErrors в файл Web.config в узле <system.web> следующим образом:

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

В customErrors разделе указывается режим, для которого задано значение "Вкл". Он также указывает defaultRedirectприложение, на какую страницу следует перейти при возникновении ошибки. Кроме того, вы добавили определенный элемент ошибки, который указывает, как обрабатывать ошибку 404, когда страница не найдена. Далее в этом руководстве вы добавите дополнительную обработку ошибок, которая будет записывать сведения об ошибке на уровне приложения.

Запуск приложения

Теперь вы можете запустить приложение, чтобы просмотреть обновленные маршруты.

  1. Нажмите клавишу F5 , чтобы запустить пример приложения Wingtip Toys.
    Откроется браузер и отображается страница Default.aspx .

  2. Введите следующий URL-адрес в браузере ( обязательно используйте номер порта):
    https://localhost:44300/NoPage.aspx

  3. Просмотрите ErrorPage.aspx, отображенную в браузере.

    обработка ошибок ASP.NET — ошибка страницы не найдена

При запросе страницы NoPage.aspx , которая не существует, страница ошибки будет отображать простое сообщение об ошибке и подробные сведения об ошибке, если доступны дополнительные сведения. Однако если пользователь запросил несуществующие страницы из удаленного расположения, страница ошибки будет отображать только сообщение об ошибке красным цветом.

Включение исключения для тестирования

Чтобы проверить, как приложение будет работать при возникновении ошибки, можно намеренно создать условия ошибки в ASP.NET. В примере приложения Wingtip Toys вы создадим тестовое исключение при загрузке страницы по умолчанию, чтобы увидеть, что происходит.

  1. Откройте файл с кодом, связанный со страницей Default.aspx в Visual Studio.
    Откроется страница Default.aspx.cs кодовой части.

  2. В обработчике Page_Load добавьте код, чтобы обработчик появился следующим образом:

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

Можно создать различные типы исключений. В приведенном выше коде создается объект InvalidOperationException при загрузке страницы Default.aspx .

Запуск приложения

Вы можете запустить приложение, чтобы узнать, как приложение обрабатывает исключение.

  1. Нажмите клавиши CTRL+F5 , чтобы запустить пример приложения Wingtip Toys.
    Приложение вызывает исключение InvalidOperationException.

    Замечание

    Чтобы отобразить страницу без перехода в код, необходимо нажать CTRL+F5 для просмотра источника ошибки в Visual Studio.

  2. Просмотрите ErrorPage.aspx, отображаемую в браузере.

    Обработка ошибок ASP.NET — страница ошибок

Как видно из сведений об ошибке, исключение было перехвачено секцией customError в файле Web.config.

Добавление обработки ошибок на уровне приложения

Вместо того чтобы перехватить исключение с помощью customErrors раздела в файле Web.config, где вы получаете мало информации об исключении, вы можете перехватить ошибку на уровне приложения и получить подробности ошибки.

  1. В обозревателе решений найдите и откройте файл Global.asax.cs .

  2. Добавьте обработчик Application_Error таким образом, чтобы он отображался следующим образом:

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

При возникновении ошибки в приложении Application_Error вызывается обработчик. В этом обработчике извлекается и проверяется последнее исключение. Если исключение было необработанным и исключение содержит сведения о внутреннем исключении (то есть InnerException не null), приложение передает выполнение на страницу ошибки, где отображаются сведения об исключении.

Запуск приложения

Вы можете запустить приложение, чтобы просмотреть дополнительные сведения об ошибке, предоставленные путем обработки исключения на уровне приложения.

  1. Нажмите клавиши CTRL+F5 , чтобы запустить пример приложения Wingtip Toys.
    Приложение выбрасывает исключение InvalidOperationException .

  2. Просмотрите ErrorPage.aspx, отображаемую в браузере.

    обработка ошибок ASP.NET — ошибка уровня приложения

Добавление обработки ошибок на уровне страницы

Вы можете добавить обработку ошибок на уровне страницы, либо добавив атрибут ErrorPage в директиву @Page, либо добавив обработчик события Page_Error в файл кода за страницей. В этом разделе вы добавите Page_Error обработчик событий, который передаст выполнение на страницу ErrorPage.aspx .

  1. В обозревателе решений найдите и откройте файл Default.aspx.cs .

  2. Добавьте обработчик Page_Error, чтобы код за кадром выглядел следующим образом:

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

При возникновении ошибки на странице Page_Error вызывается обработчик событий. В этом обработчике извлекается и проверяется последнее исключение. Если происходит InvalidOperationException, обработчик событий Page_Error передает выполнение на страницу ошибки, на которой отображаются сведения об исключении.

Запуск приложения

Теперь вы можете запустить приложение, чтобы просмотреть обновленные маршруты.

  1. Нажмите клавиши CTRL+F5 , чтобы запустить пример приложения Wingtip Toys.
    Приложение выбрасывает InvalidOperationException .

  2. Просмотрите ErrorPage.aspx, отображаемую в браузере.

    Обработка ошибок в ASP.NET — ошибка на уровне страницы

  3. Закройте окно браузера.

Удаление исключения, используемого для тестирования

Чтобы разрешить примеру приложения Wingtip Toys функционировать без исключения, добавленного ранее в этом руководстве, удалите исключение.

  1. Откройте файл кода, связанный со страницей Default.aspx.

  2. В обработчике Page_Load удалите код, который создает исключение, чтобы обработчик появился следующим образом:

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

Добавление журналирования ошибок на уровне кода

Как упоминалось ранее в этом руководстве, можно добавить инструкции try/catch, чтобы попытаться запустить раздел кода и обработать первую ошибку, которая возникает. В этом примере вы будете записывать только сведения об ошибке в файл журнала ошибок, чтобы эта ошибка была рассмотрена позже.

  1. В обозревателе решений в папке логики найдите и откройте файл PayPalFunctions.cs .

  2. HttpCall Обновите метод таким образом, чтобы код отображалось следующим образом:

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

Приведенный LogException выше код вызывает метод, содержащийся в ExceptionUtility классе. Вы добавили файл класса ExceptionUtility.cs в папку логики ранее в этом руководстве. Метод LogException принимает два параметра. Первый параметр — это объект исключения. Второй параметр — это строка, используемая для распознавания источника ошибки.

Проверка сведений об журнале ошибок

Как упоминалось ранее, журнал ошибок можно использовать для определения ошибок в приложении. Конечно, будут записаны только ошибки, записанные в журнал ошибок.

  1. В обозревателе решений найдите и откройте файл ErrorLog.txt в папке App_Data .
    Может потребоваться выбрать параметр "Показать все файлы" или "Обновить" в верхней части обозревателя решений , чтобы просмотреть файлErrorLog.txt .

  2. Просмотрите журнал ошибок, отображаемый в Visual Studio:

    Обработка ошибок ASP.NET — ErrorLog.txt

Безопасные сообщения об ошибках

Важно отметить, что при отображении сообщений об ошибках приложение не должно предоставлять информацию, которую злоумышленник может использовать для атаки приложения. Например, если приложение не удалось выполнить запись в базу данных, оно не должно отображать сообщение об ошибке, включающее имя пользователя, которое оно использует. По этой причине для пользователя отображается универсальное сообщение об ошибке красным цветом. Все дополнительные сведения об ошибке отображаются только для разработчика на локальном компьютере.

Использование ELMAH

ELMAH (модули ведения журнала ошибок и обработчики) — это средство ведения журнала ошибок, подключаемое к приложению ASP.NET в виде пакета NuGet. ELMAH предоставляет следующие возможности:

  • Ведение журнала необработанных исключений.
  • Веб-страница для просмотра всего журнала перекодированных необработанных исключений.
  • Веб-страница для просмотра полных сведений о каждом зарегистрированном исключении.
  • Уведомление по электронной почте о каждой ошибке во время ее возникновения.
  • RSS-канал последних 15 ошибок из журнала.

Прежде чем работать с ELMAH, необходимо установить его. Это легко с помощью установщика пакетов NuGet . Как упоминалось ранее в этом руководстве, NuGet — это расширение Visual Studio, которое упрощает установку и обновление библиотек и инструментов с открытым исходным кодом в Visual Studio.

  1. В Visual Studio в меню "Инструменты" выберите Диспетчер пакетов NuGet>Управление пакетами NuGet для решения.

    обработка ошибок ASP.NET — управление пакетами NuGet для решения

  2. Диалоговое окно "Управление пакетами NuGet " отображается в Visual Studio.

  3. В диалоговом окне "Управление пакетами NuGet " разверните узел Online слева и выберите nuget.org. Затем найдите и установите пакет ELMAH из списка доступных пакетов в Интернете.

    обработка ошибок ASP.NET — пакет NuGet ELMA

  4. Чтобы скачать пакет, вам потребуется подключение к Интернету.

  5. В диалоговом окне "Выбор проектов " установите флажок WingtipToys и нажмите кнопку "ОК".

    обработка ошибок ASP.NET — диалоговое окно выбора проектов

  6. При необходимости нажмите кнопку "Закрыть " в диалоговом окне "Управление пакетами NuGet ".

  7. Если Visual Studio запрашивает перезагрузку всех открытых файлов, нажмите кнопку "Да для всех".

  8. Пакет ELMAH добавляет записи для себя в файл Web.config в корне проекта. Если Visual Studio попросит вас перезагрузить измененный файлWeb.config , нажмите кнопку "Да".

ELMAH теперь готов хранить любые необработанные ошибки, возникающие.

Просмотр журнала ELMAH

Просмотр журнала ELMAH прост, но сначала вы создадите необработанное исключение, которое будет записано в журнале ELMAH.

  1. Нажмите клавиши CTRL+F5 , чтобы запустить пример приложения Wingtip Toys.

  2. Чтобы записать необработанное исключение в журнал ELMAH, перейдите в браузере по следующему URL-адресу (используя номер порта):
    https://localhost:44300/NoPage.aspx Откроется страница ошибок.

  3. Чтобы отобразить журнал ELMAH, перейдите в браузере по следующему URL-адресу (используя номер порта):
    https://localhost:44300/elmah.axd

    Обработка ошибок ASP.NET — журнал ошибок ELMAH

Сводка

В этом руководстве вы узнали об обработке ошибок на уровне приложения, уровне страницы и уровне кода. Вы также узнали, как регистрировать обработанные и необработанные ошибки для последующей проверки. Вы добавили служебную программу ELMAH для предоставления журнала исключений и уведомлений приложению с помощью NuGet. Кроме того, вы узнали о важности безопасных сообщений об ошибках.

Заключение серии учебных пособий

Спасибо, что следите за нами. Я надеюсь, что этот набор учебников помог вам стать более знакомым с ASP.NET веб-формами. Если вам нужна дополнительная информация о функциях веб-форм, доступных в ASP.NET 4.5 и Visual Studio 2013, см. заметки о релизе ASP.NET и веб-инструментов для Visual Studio 2013. Кроме того, обязательно ознакомьтесь с учебником, упомянутым в разделе "Дальнейшие действия", и обязательно попробуйте бесплатную пробную версию Azure.

Спасибо - Эрик

Дальнейшие шаги

Дополнительные сведения о развертывании веб-приложения в Microsoft Azure см. в статье "Развертывание безопасного приложения ASP.NET веб-форм с членством, OAuth и базой данных SQL на веб-сайте Azure".

Пробная версия

Microsoft Azure — бесплатная пробная версия
Публикация веб-сайта в Microsoft Azure позволит сэкономить время, обслуживание и расходы. Это быстрый процесс развертывания веб-приложения в Azure. Если вам нужно поддерживать и отслеживать веб-приложение, Azure предлагает различные инструменты и службы. Управление данными, трафиком, удостоверением, резервными копиями, сообщениями, мультимедиа и производительностью в Azure. И все это обеспечивается в очень экономичном подходе.

Дополнительные ресурсы

Регистрация сведений об ошибках с использованием мониторинга работоспособности ASP.NET
ELMAH

Благодарности

Я хотел бы поблагодарить следующих людей, которые внесли значительный вклад в содержимое этой серии учебников:

Вклад сообщества