2010-02-18 84 views
6

我们有一个系统,我们在IIS中托管几个WCF应用程序。其中一些应用程序的启动时间有点延长,需要几秒钟(比用户更乐意等待)。一旦启动并运行,虽然一切都很快,所以它只是启动时间。如何避免IIS托管的WCF应用程序出现冷启动问题?

客户端还需要每天晚上回收应用程序池。

是否有某种方法可以唤醒所有这些服务,以便启动时间对系统的第一个用户不是问题?

最初的想法是在哪里编写一个windows服务,该服务只需在每个x(可配置)分钟内调用每个服务的轻量级方法以保持应用程序的活动,但由于我们处于负载平衡的环境中,并且应用程序需要特定的主机头部被传递时,我们总是会打到负载平衡地址,这意味着我们无法确保群集中所有框上的所有服务都实际启动。

由于IIS中的一个wcf应用程序只能有一个主机头,唯一的另一种方法是设置指向同一应用程序的第二个iis网站。我只是不确定这是否会做到这一点,因为它会在另一个主机上下文中。

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

任何想法,将不胜感激。

感谢

Gineer

+1

IIS7有一个名为Application Warmup或类似的功能。 – 2010-02-18 16:41:35

回答

2

对于我们的7.5版以前一个版本的IIS运行,我们在测试下面的解决方案的过程...

正如原帖子中提到,最初的想法是从每台机器上运行的服务中发出一个WebRequest到本地Web站点(托管WCF服务),但这是不可能的,因为它们都使用Host头部,并且它们都位于网络负载平衡的场中。

然后,我们认为我们可以简单地将Web请求中的自定义主机标头提供给本地主机。

原来,您无法更新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

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

3

优秀。感谢Dercsár

经过一个快速的Google,我找到了关于这个问题的以下arcticle:Using the IIS Application Warm-Up Module

这里的局限性是,这只适用于带有IIS 7.5的Windows 2008 R2。虽然我们的客户正在升级到Win 2K8R2,但这可能还有一段时间。

有谁知道一个解决方案,将工作在Windows 2003与IIS 6或我们将不得不写一些做这项工作?

Gineer

相关问题