如何:避免IIS托管的WCF应用程序的冷启动问题?

时间:2010-02-18 16:38:03

标签: wcf iis

我们有一个系统,我们在IIS中托管几个WCF应用程序。其中一些应用程序有一段延长的启动时间需要几秒钟(超过用户愿意等待的时间)。一旦它启动并运行,一切都很快,所以它真的只是启动时间。

客户端还要求每晚回收应用程序池。

有没有办法唤醒所有这些服务,以便启动时间对于系统的第一个用户来说不是问题?

初步想到在哪里编写一个Windows服务,每隔x(可配置)分钟就可以在每个服务上调用一个轻量级方法,以保持应用程序的活动,但是因为我们处于负载平衡环境中,并且应用程序需要特定的主机头要传递,我们总是会遇到负载均衡地址,这意味着我们无法确保群集中所有盒子上的所有服务都已实际启动。

由于IIS中的单个wcf应用程序只能有一个主机头,因此唯一的另一种方法是设置指向同一应用程序的第二个iis网站。我只是不确定这是否会起作用,因为它会在另一个主机环境中。

另一种选择可能是在IIS或应用程序池实际再次启动时,可能会调用IIS的扩展(不确定是否可能),这可能会调用我们的每个服务。 (当应用程序池已经回收但在第一个用户请求之前注意到的事情。

非常感谢任何想法。

由于

Gineer

2 个答案:

答案 0 :(得分:3)

优异。谢谢Dercsár

快速Google之后,我发现了以下主题:Using the IIS Application Warm-Up Module

此处的限制是仅适用于带有IIS 7.5的Windows 2008 R2。虽然我们的客户正在升级到Win 2K8R2,但这可能还需要一段时间。

有没有人知道一个适用于带有IIS 6的Windows 2003的解决方案,还是我们必须写一些能让它工作的解决方案?

Gineer

答案 1 :(得分:2)

对于我们这些在7.5之前的IIS版本上运行的人,我们正在测试以下解决方案......

正如原帖中所提到的,最初的想法是将WebRequest从每台机器上运行的服务发送到本地网站(托管WCF服务),但这是不可能的,因为它们都可以使用主机标头,它们都位于网络负载平衡服务器场中。

然后我们认为我们可以简单地在Web请求中向localhost提供自定义主机头。

事实证明,您无法在WebRequest中更新主机头名称。这是一个只读字段。

使用代理类进行混乱可以使其工作。 请参阅:http://social.msdn.microsoft.com/forums/en-US/netfxnetcom/thread/1b35c665-fe32-4433-8877-a62f2d400a8e/

我在C#下面的一小段测试代码。

        WebRequest req = WebRequest.Create("<Correct Host name>");
        req.Proxy = new WebProxy("127.0.0.1");

        StreamReader stream = new StreamReader(
            req.GetResponse().GetResponseStream());

        StringBuilder sb = new StringBuilder();

        String LineString;

        while ((LineString = stream.ReadLine()) != null)
        {
            if (LineString.Length > 0)
                sb.Append(LineString);
        }
        stream.Close();

        String response = sb.ToString();

这可能不是代理类的用途,但似乎无论如何都可以。

Gineer

聚苯乙烯。不,您不需要在本地主机上安装任何实际的代理服务器。