【问题标题】:IIS: Unexpected behavior in case of unhandled exception in Application_StartIIS:Application_Start 中出现未处理异常时的意外行为
【发布时间】:2016-03-17 08:35:44
【问题描述】:

我使用的是 Windows 7,IIS 7.5.7600.16385,目前已安装 .NET 4.6.1,我们有一个 MVC 应用程序。

几天前,我们的应用程序出现了一些奇怪的行为。不幸的是,在 Application_Start 内部调用的服务不可用,并且内部引发了未处理的异常。我的预期行为是 Application_Start() 被下一个请求再次调用,或者下一个请求直接使用 Application_BeginRequest() 开始,就像What happens if an unhandled exception is thrown in Application_Start? 中提到的那样。

不幸的是,我得到以下结果:

如果 Application_Start() 内部出现异常,我在第一次请求时收到错误 500。没关系。

在此之后,所有其他请求都返回第一个请求时引发的异常。我通过在本地环境中抛出带有时间戳的异常来验证它。每个响应都包含带有第一个请求的时间戳的异常,并且 HTTP 响应仍然是 500。它不依赖于调用哪个 url。在我们的代码中没有遇到断点,但 IIS 日志显示了请求。答案似乎缓存在某处。

我个人喜欢这种行为,因为应用程序不会响应具有未定义初始化状态的请求。

是的,我知道在 Application_Start() 中调用其他服务资源不是最好的主意,我们下次可能会删除它:)

我的问题:

  • 是否可以配置在 Application_Start() 抛出异常时的行为?

  • 也许有人知道这种行为是什么时候改变的,还是已经存在很长时间了?

【问题讨论】:

    标签: c# asp.net iis unhandled-exception application-start


    【解决方案1】:

    好吧,我分析了这种情况并搜索了许多网站,但找不到任何有关它的信息。但是,我设法观察到这种行为:

    • 当在 Application_Start 中引发未处理的错误时,IIS 返回错误页面并且 Web 应用程序开始关闭。
    • 在关闭期间(在我的情况下为 10 秒),任何新请求都由 IIS 处理,并且响应与第一个请求中的相同。如果您考虑一下,这是合乎逻辑的,因为 IIS 知道该网站正在关闭,所以很明显是最后一个错误导致了它。
    • 一段时间后,应用程序引发 Application_End 事件以告知关闭已完成。在该事件之后,对网站的下一个请求将再次引发 Application_Start 并生成新的响应。

    我认为您无法更改此行为,因为应用程序只需要一些时间来重新启动。

    【讨论】:

    • 嗨,莱斯米安。谢谢您的回答。我在我的私人计算机上安装了 IIS Express 8 以通过全新安装再次对其进行测试,你是对的。 Application_Start 出现异常后大约需要 10 秒,此时异常是响应的一部分。
    • 不幸的是,这与我在商用计算机和服务器上的行为不同。在办公室,我使用了相同的测试应用程序,但它没有在 10 分钟内调用 Application_End。我们的实时服务器报告的应用程序在 4 小时内没有调用它(在本地机器上测试,30 分钟后也显示了相同的异常)。但是你的解释听起来不错,我会检查为什么在业务安装时没有调用 Application_End(检查 IIS 7 与 IIS 8,安装的模块等等)。
    【解决方案2】:

    今天我有时间再次检查行为。我们在一些版本之前介绍了 Serilog,似乎该配置对重启行为有影响。

    protected void Application_Start()  
    {  
      SerilogManager.Configure(); //own class  
      using (LogContext.PushProperty(SerilogManager.PROPERTY_NAME_ComponentName, "xxx")){}    
      throw new Exception(DateTime.Now.ToString("hh:mm:ss"));  
    }  
    

    如果我从 Application_Start 中删除 PushProperty 行,那么重新启动将毫无问题地工作。使用此行不会调用 Application_End。

    现在我可以在私人和商用计算机上复制它。不知道为什么我的演示应用程序上次没有在我的业务机器上调用 Application_end。

    【讨论】:

      猜你喜欢
      • 2021-09-14
      • 2020-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-20
      • 2012-04-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多