我正在使用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()中抛出异常,是否可以配置行为?
也许有人知道这种行为何时被改变或者它已经存在了很长时间?
答案 0 :(得分:0)
我分析了这个场景并搜索了很多网站,但是找不到任何关于它的信息。但是,我设法观察到了这样的行为:
我认为你不能改变这种行为,因为应用程序只需要一些时间来重启。
答案 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。