我们有一个系统,我们在IIS中托管几个WCF应用程序.其中一些应用程序有一段延长的启动时间需要几秒钟(超过用户愿意等待的时间).一旦它启动并运行,一切都很快,所以它真的只是启动时间.
客户端还需要每晚回收应用程序池.
有没有办法唤醒所有这些服务,以便启动时间不是系统的第一个用户的问题?
初步想到在哪里编写一个Windows服务,每隔x(可配置)分钟就可以在每个服务上调用一个轻量级方法,以保持应用程序的活跃,但是因为我们处于负载平衡环境中,并且应用程序需要传递特定的主机头,我们总是会遇到负载均衡地址,这意味着我们无法确保群集中所有盒子上的所有服务都已实际启动.
由于IIS中的单个wcf应用程序只能有一个主机头,因此唯一的另一种方法是设置指向同一应用程序的第二个iis网站.我只是不确定这是否会成功,因为它将在另一个主机环境中.
另一种选择可能是在IIS或应用程序池实际再次启动时,可能会调用IIS的扩展(不确定是否可能),这可能会调用我们的每个服务.(当应用程序池已经回收但在第一个用户请求之前注意到的事情.
任何想法将不胜感激.
谢谢
Gineer
对于我们这些运行 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 归档时间: |
|
查看次数: |
2772 次 |
最近记录: |