为什么Global.asax.cs Application_Error执行了两次(在这个例子中)?

时间:2017-05-10 16:28:33

标签: c# asp.net visual-studio

退后一步,我正在学习ASP.NET错误处理,我特意看了这篇文章:https://docs.microsoft.com/en-us/aspnet/web-forms/overview/getting-started/getting-started-with-aspnet-45-web-forms/aspnet-error-handling

我已经下载了他们的WingtipToys项目。

这导致我执行以下操作(Visual Studio 2013,.NET 4.5):

  1. 新项目 - ASP.NET Web应用程序(我将其命名为EmptyWebApp)。

    一个。在本向导的下一个屏幕上,我选择了Empty,对于Add files和core references,我确保Web Forms,MVC,Web API都未经检查。

  2. 添加了一个新的Web表单(名为WebForm1)。

  3. .cs中的代码如下所示:

    public partial class WebForm1 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            throw new Exception("foo");
        }
    }
    
    1. 添加了一个新的Web表单(名为ErrorPage),除了添加“我是一个错误页面”之外,我保留了默认的html代码。在div标签之间。
    2. .cs中的代码如下所示:

      public partial class ErrorPage : System.Web.UI.Page
      {
          protected void Page_Load(object sender, EventArgs e)
          {
              Server.ClearError();
          }
      }
      
      1. 添加了新的全球应用程序类
      2. 代码的唯一功能是:

            protected void Application_Error(object sender, EventArgs e)
            {
                Exception exc = Server.GetLastError();
        
                Server.Transfer("ErrorPage.aspx");
            }
        

        (是的,exc现在什么也没做,但我打算使用它。)

        当我编译并运行时(在ErrorPage中的Server.Transfer和Server.ClearError上使用断点),我注意到断点被命中两次。

        它执行以下操作:

        a. Server.Transfer (in Application_Error)
        b. Server.ClearError (in Page_Load of ErrorPage)
        c. Server.Transfer (in Application_Error)
        d. Server.ClearError (in Page_Load of ErrorPage)
        

        所以,它被转移了两次,而页面加载了两次。

        我第一次到达Server.Transfer断点(a。)时,exc有一个值。 第二次到达Server.Transfer断点(c。),exc为null。

        注释掉Server.ClearError,它不会加载两次。

        在Server.Transfer之后立即放置Server.ClearError,我们再次加载两次。

        删除Server.Transfer(在Application_Error中)并保留Server.ClearError(),并执行一次。

        因此,Sever.Transfer和Server.ClearError的某些组合导致了这种情况。

        但是,当我运行WingTipToys项目时,他们的Page_Load中有一个Server.ClearError,并且它不会导致Application_Error执行两次。我的意思是,如果它正在执行两次,是否会发生一些错误(我无法解释)?

        我认为这不是什么大问题,但它让我停下来,我的简单项目表现出不同的运行时行为。

        谢谢!

0 个答案:

没有答案