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

Gin*_*eer 6 iis wcf

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

客户端还需要每晚回收应用程序池.

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

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

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

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

任何想法将不胜感激.

谢谢

Gineer

Gin*_*eer 2

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

\n\n

正如原始帖子中提到的,最初的想法是从每台计算机上运行的服务向本地网站(托管 WCF 服务)发出 WebRequest,但这是不可能的,因为它们都使用 Host 标头,它们都生活在网络负载平衡场中。

\n\n

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

\n\n

事实证明,您无法更新 WebRequest 中的主机标头名称。它\xe2\x80\x99 是只读字段。

\n\n

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

\n\n

下面是我用 C# 编写的一小段测试代码。

\n\n
        WebRequest req = WebRequest.Create("<Correct Host name>");\n        req.Proxy = new WebProxy("127.0.0.1");\n\n        StreamReader stream = new StreamReader(\n            req.GetResponse().GetResponseStream());\n\n        StringBuilder sb = new StringBuilder();\n\n        String LineString;\n\n        while ((LineString = stream.ReadLine()) != null)\n        {\n            if (LineString.Length > 0)\n                sb.Append(LineString);\n        }\n        stream.Close();\n\n        String response = sb.ToString();\n
Run Code Online (Sandbox Code Playgroud)\n\n

这可能不是代理类的目的,但它似乎可以以任何方式工作。

\n\n

吉内尔

\n\n

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

\n