Поделиться через


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

Эрик Рейтан

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

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

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

Из этого руководства вы узнаете, как выполнять такие задачи:

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

Общие сведения

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

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

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

Класс Exception

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

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

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

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

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

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

Когда приложение обрабатывает исключения, пользователю часто можно получить и отобразить дополнительные сведения об исключении, наследуемом от класса 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//catchfinally ошибок.

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 класс в папку Logic . При этом каждый раз, когда приложение обрабатывает ошибку, сведения об ошибке будут добавляться в файл журнала ошибок.

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

  2. Выберите группу шаблоныVisual C#> слева. Затем выберите Классв среднем списке и назовите его 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 templates слева. В среднем списке выберите Веб-форма с главной страницей и назовите ее ErrorPage.aspx.

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

  4. Выберите файл Site.Master в качестве страницы 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, который сообщает приложению, на какую страницу следует переходить при возникновении ошибки. Кроме того, вы добавили определенный элемент error, указывающий, как обрабатывать ошибку 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 .

Добавление Application-Level обработки ошибок

Вместо перехвата исключения с помощью 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 — ошибка уровня приложения

Добавление Page-Level обработки ошибок

Вы можете добавить обработку ошибок на уровне страницы на страницу с помощью добавления 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 вызывается обработчик событий. В этом обработчике извлекается и проверяется последнее исключение. При возникновении InvalidOperationExceptionPage_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)
    {
    
    }
    

Добавление журнала ошибок Code-Level

Как упоминалось ранее в этом руководстве, можно добавить инструкции 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 в папку Logic ранее в этом руководстве. Метод 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 разверните узел В сети слева и выберите 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 Web Forms. Дополнительные сведения о функциях веб-формы, доступных в ASP.NET 4.5 и Visual Studio 2013, см. в разделе ASP.NET and Web Tools заметки о выпуске Visual Studio 2013. Кроме того, обязательно ознакомьтесь с руководством, упомянутым в разделе "Дальнейшие действия" , и обязательно опробуйте бесплатную пробную версию Azure.

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

Next Steps

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

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

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

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

Ведение журнала сведений об ошибках с помощью мониторинга работоспособности ASP.NET
ELMAH

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

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

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