IIS:Application_Start

时间:2016-03-17 08:35:45

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

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

前几天我们在申请时遇到了一些奇怪的行为。不幸的是,在Application_Start中调用的服务不可用,并且内部抛出了未处理的异常。我的预期行为是使用下一个请求再次调用Application_Start(),或者下一个请求直接使用What happens if an unhandled exception is thrown in Application_Start?中提到的Application_BeginRequest()启动。

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

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

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

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

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

我的问题:

  • 如果在Application_Start()中抛出异常,是否可以配置行为?

  • 也许有人知道这种行为何时被改变或者它已经存在了很长时间?

2 个答案:

答案 0 :(得分:0)

我分析了这个场景并搜索了很多网站,但是找不到任何关于它的信息。但是,我设法观察到了这样的行为:

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

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

答案 1 :(得分: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。