通过


ASP.NET 错误处理

作者 :Erik Reitan

下载 Wingtip Toys 示例项目 (C#)下载电子书 (PDF)

本教程系列将介绍如何使用 ASP.NET 4.5 和 Microsoft Visual Studio Express 2013 for Web 生成 ASP.NET Web 窗体应用程序。 Visual Studio 2013 包含 C# 源代码的项目 随本教程系列一起提供。

在本教程中,你将修改 Wingtip Toys 示例应用程序,以包括错误处理和错误日志记录。 错误处理将允许应用程序正常处理错误并相应地显示错误消息。 通过错误日志记录,可以查找并修复已发生的错误。 本教程基于前面的教程“URL 路由”,是 Wingtip Toys 教程系列的一部分。

你将了解的内容:

  • 如何向应用程序的配置添加全局错误处理。
  • 如何在应用程序、页面和代码级别添加错误处理。
  • 如何记录错误以供以后查看。
  • 如何显示不损害安全性的错误消息。
  • 如何实现错误日志记录模块和处理程序(ELMAH)错误日志记录。

概述

ASP.NET 应用程序必须能够以一致的方式处理执行过程中发生的错误。 ASP.NET 使用公共语言运行时(CLR),它提供了一种以统一的方式通知应用程序错误的方法。 发生错误时,将引发异常。 异常是应用程序遇到的任何错误、条件或意外行为。

在 .NET Framework 中,异常是从 System.Exception 类继承的对象。 异常引发自发生问题的代码区域。 异常沿调用堆栈向上传递,到应用程序提供处理异常代码的位置。 如果应用程序未处理异常,则浏览器被迫显示错误详细信息。

最佳做法是,在代码块中处理代码级Try/Catch/Finally错误。 尝试放置这些块,以便用户可以在问题发生的上下文中更正问题。 如果错误处理块离发生错误的位置太远,则向用户提供解决问题所需的信息会变得更加困难。

Exception 类

Exception 类是异常继承的基类。 大多数异常对象是 Exception 类的某些派生类的实例,例如 SystemException 类、 IndexOutOfRangeException 类或 ArgumentNullException 类。 Exception 类具有属性(如 StackTrace 属性、 InnerException 属性和 Message 属性),这些属性提供有关所发生错误的特定信息。

异常继承层次结构

运行时有一组基于 SystemException 类派生的异常集,当遇到异常时,运行时会抛出这些异常。 从 Exception 类继承的大多数类(如 IndexOutOfRangeException 类和 ArgumentNullException 类)不会实现其他成员。 因此,异常的最重要的信息可以在异常层次结构、异常名称和异常中包含的信息中找到。

异常处理层次结构

在 ASP.NET Web 窗体应用程序中,可以根据特定的处理层次结构处理异常。 可以在以下级别处理异常:

  • 应用程序级别
  • 页面级别
  • 代码级别

当应用程序处理异常时,通常可以检索和显示从 Exception 类继承的异常的其他信息。 除了应用程序、页面和代码级别,还可以使用 IIS 自定义处理程序在 HTTP 模块级别处理异常。

应用程序级别错误处理

可以通过修改应用程序的配置或在应用程序的 Application_Error 文件中添加处理程序来处理应用程序级别的默认错误。

可以通过将 customErrors 节添加到 Web.config 文件中来处理默认错误和 HTTP 错误。 通过此 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 文件中的处理程序来捕获应用程序中任何地方发生的错误。

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

页面级别错误事件处理

页面级处理程序将用户返回到发生错误的页面,但由于控件实例未维护,因此页面上不再存在任何内容。 若要向应用程序的用户提供错误详细信息,必须专门将错误详细信息写入页面。

通常使用页面级错误处理程序记录未经处理的错误,或者将用户带到可以显示有用信息的页面。

此代码示例显示 ASP.NET 网页中 Error 事件的处理程序。 此处理程序捕获页面块中 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 服务器对象(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异常,执行将转移到其他页面。 然后,执行最后块中包含的代码,无论是否发生错误。

添加错误日志记录支持功能

在向 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 该方法将异常写入异常日志文件。 此方法采用两个参数:异常对象和包含有关异常源的详细信息的字符串。 异常日志将写入App_Data文件夹中 的ErrorLog.txt 文件。

添加错误页

在 Wingtip Toys 示例应用程序中,一页将用于显示错误。 错误页旨在向网站用户显示安全错误消息。 但是,如果用户是开发人员发出 HTTP 请求,该请求在代码所在的计算机上本地提供,则会在错误页上显示其他错误详细信息。

  1. 右键单击解决方案资源管理器中的项目名称(Wingtip Toys),然后选择“添加新>”。
    将显示“ 添加新项 ”对话框。

  2. 选择左侧的 Visual C# ->Web 模板组。 从中间列表中选择 包含母版页的 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 请求在本地发出,则会显示所有错误详细信息。 在这种情况下,只有运行 Web 应用程序的本地计算机才会看到这些错误详细信息。 显示错误信息后,错误将添加到日志文件中,并从服务器中清除错误。

显示应用程序的未经处理的错误消息

通过将节 customErrors 添加到 Web.config 文件,可以快速处理整个应用程序中发生的简单错误。 还可以指定如何根据错误的状态代码值(如 404 - 找不到文件)来处理错误。

更新配置

通过将customErrors节添加到Web.config文件来更新配置。

  1. 解决方案资源管理器中,查找并打开 Wingtip Toys 示例应用程序的根目录下 Web.config 文件。

  2. customErrors节添加到<system.web>节点中的Web.config文件,如下所示:

    <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. 在 Visual Studio 中打开 Default.aspx 页的背后代码。
    将显示 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页面时创建一个

运行应用程序

可以运行应用程序以查看应用程序如何处理异常。

  1. Ctrl+F5 运行 Wingtip Toys 示例应用程序。
    应用程序会抛出 InvalidOperationException 异常。

    注释

    必须按 Ctrl+F5 才能显示页面,而不会中断代码,才能在 Visual Studio 中查看错误源。

  2. 查看浏览器中显示的 ErrorPage.aspx

    ASP.NET 错误处理 - 错误页

错误详细信息中显示,异常是由 customError 节在 Web.config 文件中捕获的。

应用级错误处理添加

与其使用 customErrorsWeb.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_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. 解决方案资源管理器中,查找并打开App_Data文件夹中的ErrorLog.txt 文件。
    可能需要从解决方案资源管理器顶部选择“显示所有文件”选项或“刷新”选项以查看 ErrorLog.txt 文件。

  2. 查看 Visual Studio 中显示的错误日志:

    ASP.NET 错误处理 - ErrorLog.txt

安全错误消息

请务必 注意 ,当应用程序显示错误消息时,它不应提供恶意用户可能发现攻击应用程序有用的信息。 例如,如果应用程序尝试写入数据库失败,则它不应显示包含正在使用的用户名的错误消息。 因此,向用户显示红色的通用错误消息。 所有其他错误详细信息仅显示给本地计算机上的开发人员。

使用 ELMAH

ELMAH(错误日志记录模块和处理程序)是一种错误日志记录工具,你可以将其作为 NuGet 包集成到 ASP.NET 应用程序中。 ELMAH 提供以下功能:

  • 未处理的异常的日志记录。
  • 用于查看重新编码的未处理的异常的完整日志的网页。
  • 一个网页,用于查看每个记录的异常的完整详细信息。
  • 每次错误发生时,会通过电子邮件发送通知。
  • 日志中最后 15 个错误的 RSS 源。

在使用 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 错误处理 - ELMA NuGet 包

  4. 需要建立 Internet 连接才能下载包。

  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 窗体。 如果需要有关 ASP.NET 4.5 和 Visual Studio 2013 中提供的 Web 窗体功能的详细信息,请参阅 适用于 Visual Studio 2013 发行说明的 ASP.NET 和 Web 工具。 此外,请务必查看“ 后续步骤 ”部分中提到的教程,并明确试用 免费的 Azure 试用版

谢谢 - 埃里克

后续步骤

详细了解如何将 Web 应用程序部署到 Microsoft Azure,请参阅 将成员身份、OAuth 和 SQL 数据库的安全 ASP.NET Web 窗体应用部署到 Azure 网站

免费试用版

Microsoft Azure - 免费试用
将网站发布到 Microsoft Azure 将节省时间、维护和费用。 将 Web 应用部署到 Azure 的过程很快。 需要维护和监视 Web 应用时,Azure 提供了各种工具和服务。 管理 Azure 中的数据、流量、标识、备份、消息传送、媒体和性能。 而且,所有这些都以非常经济高效的方法提供。

其他资源

使用 ASP.NET 运行状况监控记录错误详情
ELMAH

鸣谢

我要感谢以下为本教程系列内容做出重要贡献的人:

社区贡献