在ASP.NET应用程序启动时显示存根页面

在ASP.NET应用程序仍处于初始化过程中时,是否可以显示特定页面?

我们有一个巨大的ASP.NET应用程序,在每次重新部署或AppDomain重新启动后,需要大约30秒才能完成其Application_Start()处理程序。 在此期间显示一个不错的自动重新加载“暂时不可用”页面将极大地改善第一用户的体验。

我试图将初始化程序代码提取到不同的线程中,但它有很多依赖项: HttpContextServer和其他几个类在派生线程中不可用。 代码变得干扰和不可理解,所以我正在寻找更好的解决方案。 也许一些IIS配置或扩展?

好吧,从IIS 7.5开始,您可以使用应用程序初始化( http://www.iis.net/downloads/microsoft/application-initialization ),这样可以显示“splash-Screen”或者只是预先显示启动应用程序池。

以下是IIS8的解释: http ://www.iis.net/learn/get-started/whats-new-in-iis-8/iis-80-application-initialization它与IIS7.5类似,但是你必须事先安装模块。

以下是评论中的链接: http : //blogs.msdn.com/b/abhisk/archive/2013/08/16/configuring-application-initialization.aspx

你可以加载一个不受系统启动影响的静态html页面或页面,然后通过ajax poll / check一些只有在应用程序启动时才可用的东西(值等),这样你就可以有一个动画或一些加载页面上的信息。

我想你正在寻找一些不可能的东西。 因此,您希望创建一个需要很长时间才能完成的Application_Start,并且您希望应用程序在此期间做出响应。 Application_Start是一个同步事件,这意味着单个请求在完成之前不会开始处理。 毕竟这是它的工作。

你必须以某种方式放松你的要求。 这是一些想法。

一个新的HTTP层

正如我所说,在Application_Start完成之前,您无法在应用程序中运行.NET代码。 但是你可以运行另一个不同的应用程序。

因此,让我们创建面向客户端的另一个应用程序。 反向代理或类似的。 我确信有反向代理实现可以让你做一些脚本并解决问题。 另一方面,我自己在C#中编写了一个简单的反向代理。 当它收到HTTP请求时,它创建了一个HttpWebRequest并将其转发到另一个URL。 它支持GET和POST,它现在正在生产多年。 如果您有兴趣,我可以分享一些有关它的细节。

您唯一需要解决的是后端应用程序如何与前端进行通信。 这很简单,你可以使用WCF,IPC,在某处创建一个简单的0字节标记文件,任何东西。 当Application_Start启动时,您可以创建该0字节文件,完成后将其删除。

请注意,在关闭应用程序,重新启动应用程序以及运行Application_Start之前,会发生很多事情。 IIS初始化可能需要几秒钟。 因此,代替只有2个状态(存在/不存在)的0字节标记文件,您可以公开一个简单的WCF服务,例如使用命名管道。 它可以有3种状态:根本不响应(应用程序停止),响应应用程序正在启动,或响应应用程序正在运行。 此WCF服务必须自托管并在后台运行,因为IIS不会明显响应。

HTML / JS魔术

它基本上与上面的想法相同。 它更容易,因为您不必设置其他应用程序,但灵活性较低。 您必须为应用程序创建HTML登录页面,并且必须确保用户不对任何其他页面添加书签。 如果你能做到这一点,那你很幸运。 您可以使用上述解决方案中的想法,了解应用程序在启动时如何与外部世界进行通信。 您不能使用IIS中托管的简单Web服务,但您可以毫无问题地托管自己的WCF服务(创建自己的ServiceHost等)。 当然,这个自托管的WCF服务不会在与您的应用程序相同的主机:端口上运行。 但是在WCF中公开JSON服务非常容易。

因此,在HTML登录页面中,您编写了一些查询自托管JSON服务的JS AJAX代码。 如果没有响应,您可以告诉用户应用程序根本没有运行。 如果服务说它正在启动,您可以告诉用户。 如果服务表明应用程序正在运行,那么您将重定向您的用户。

如果您的用户在关闭网站时已经浏览过您的网站,则无法使用此function。 看,这就是为什么你需要一个全新的层。

IIS魔术

这对我来说是一个有点未知的领域。 在集成模式下,.NET是IIS不可或缺的一部分,所以我认为很难解决它。 但是,在经典模式下,.NET作为ISAPI扩展运行。 理论上,您可以编写一个在.NET之前运行的新ISAPI扩展 。 坏消息是它必须用C / C ++编写。 但很明显,因为就像我说的那样,在Application_Start完成之前你无法运行.NET代码。 但IIS在此期间并未死亡,因此在IIS级别解决它。 这可能变得丑陋,我只有99%确定它实际上是可能的。

重构

以上都是解决方法。 你真的应该重构你的代码,以便Application_Start快速完成。 它并不意味着是一个重量级的function。 已有一个用于预加载ASP.NET应用程序的框架。 如果您在初始化代码中告诉我们为什么需要HttpContext和Server,我们可以帮助您解决这些问题。