Asp.net mvc 3 如何避免在ASP.NET中将缓慢的应用程序启动时间传递给最终用户

Asp.net mvc 3 如何避免在ASP.NET中将缓慢的应用程序启动时间传递给最终用户,asp.net-mvc-3,iis-7,ioc-container,global-asax,appharbor,Asp.net Mvc 3,Iis 7,Ioc Container,Global Asax,Appharbor,我有一个相当缓慢的应用程序启动,因为有很多国际奥委会的东西发生在启动 我试图解决的问题是,如何避免将启动时间传递给最终用户 假设 我的应用程序托管在AppHarbor上,因此我无法访问IIS。然而,即使我这样做了,我的替补研究是让应用程序池循环使用是最好的做法,因此没有办法避免让应用程序定期运行(我认为在AppHarbor上每20分钟运行一次) 我的解决办法 起初,我以为我会每分钟点击一次,但这似乎太残忍了,甚至可能无法阻止用户体验缓慢的启动 我目前的解决方案是处理应用程序结束事件,然后立即点击

我有一个相当缓慢的应用程序启动,因为有很多国际奥委会的东西发生在启动

我试图解决的问题是,如何避免将启动时间传递给最终用户

假设 我的应用程序托管在AppHarbor上,因此我无法访问IIS。然而,即使我这样做了,我的替补研究是让应用程序池循环使用是最好的做法,因此没有办法避免让应用程序定期运行(我认为在AppHarbor上每20分钟运行一次)

我的解决办法 起初,我以为我会每分钟点击一次,但这似乎太残忍了,甚至可能无法阻止用户体验缓慢的启动

我目前的解决方案是处理应用程序结束事件,然后立即点击应用程序,使其再次启动,希望不会影响任何用户


有没有更好的方法来解决这个问题?

据我所知,为了防止启动时间传播给用户,您应该避免回收应用程序池,您可以使用这些应用程序池,它们可以通过web.config进行调整,而不仅仅是通过IIS控制台。此外,你可以阅读更多。您可能不需要应用程序端黑客来实现这一点

更新:
我发现了另一件有趣的事情,它可能会在这方面对您有所帮助,请检查它,它可以用于在工作进程启动时预加载依赖项。它可以帮助您改善客户体验。请查看。

不幸的是,当您使用进程内会话状态时,较长的会话超时不会阻止IIS应用程序池回收

您是否考虑过延迟加载(某些)依赖项?SimpleInjector有关于如何执行此操作的文档,这些文档应适用于大多数其他IOC:


您确定他们每20分钟回收一次吗?IIS的开箱即用经验是,当20分钟内没有活动时,他们会关闭应用程序池。当然,第一次点击的速度会慢一些,但除非你在
应用程序_Start
中做一些疯狂的事情,否则它不应该成为问题。嘿,马丁,是的,根据AppHarbor的说法,每20分钟一次。然而,你是对的,这是一个使用率很低的网站,所以它的点击率可能不够。所以我可以每隔15分钟点击一次,这样它就不会睡觉了…?我会查看
应用程序\u Start
。实际需要多长时间?你能对它进行优化,使它在第一次击中时不会出现轻微延迟的问题吗?嘿,马丁,需要5到10秒,这都是温莎国际奥委会的东西。我不介意,只要用户不必体验它。好吧,如果它不超过5-10秒,我就不会麻烦了。+1有趣的是,我会检查一下延迟加载。当你谈论进程内会话状态时,你的意思是什么?+1最小化加载时间的最佳方法是通过将特定组件的加载推迟到真正需要它们的第一次来最小化加载时发生的内容量。很抱歉,andy,响应太晚了。会话状态可以以多种方式存储。默认方法是InProcess,它只是在IIS服务器的内存中。如果您的应用程序只在一台服务器上运行,并且您对应用程序池的回收很敏感,那么它很简单,而且工作正常。另一种方法是将会话存储在数据库中,以便在应用程序池重置或用户在负载平衡环境中的服务器之间跳转后仍能生存下来。+1谢谢furqan,但应用程序池不需要回收吗?我现在就去看看你的链接。应用程序池回收可以最小化,但不应该被消除。此外,许多托管公司不允许您100%控制应用程序池回收参数(通常会强制应用程序池回收以超过内存等资源分配)。这仍然是一个很好的建议,但不是这个问题的“最佳答案”。如果你可以在不泄漏内存的情况下编码(显然你可以!),你应该禁用AppPool recycle imo。因此我认为这确实是最佳答案。