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

时间:2014-01-24 15:07:13

标签: c# asp.net asp.net-mvc iis

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

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

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

3 个答案:

答案 0 :(得分:6)

好吧,从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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

我认为你正在寻找一些不可能的东西。因此,您希望创建一个需要很长时间才能完成的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代码。如果没有响应,您可以告诉用户该应用程序根本没有运行。如果服务说它正在启动,您可以告诉用户。如果服务说应用程序正在运行,那么您将重定向您的用户。

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

IIS魔法

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

重构

以上都是解决方法。你真的应该重构你的代码,以便Application_Start快速完成。它并不意味着是一个重量级的功能。 preloading ASP.NET apps已经有了一个框架。如果您告诉我们您在初始化代码中需要HttpContext和Server的原因,我们将随时为您解决这些问题。