0

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

几天前,我们的应用程序出现了一些奇怪的行为。不幸的是,在 Application_Start 内部调用的服务不可用,并且内部引发了未处理的异常。我的预期行为是下一个请求再次调用 Application_Start(),或者下一个请求直接从 Application_BeginRequest() 开始,如在 Application_Start 中抛出未处理的异常会发生什么?.

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

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

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

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

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

我的问题:

  • 是否可以在 Application_Start() 引发异常的情况下配置行为?

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

4

2 回答 2

0

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

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

我不认为你可以改变这种行为,因为应用程序只需要一些时间来重新启动。

于 2016-03-17T11:37:51.680 回答
0

今天我有时间再次检查行为。我们在一些版本之前介绍了 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。

于 2016-03-18T15:55:28.950 回答