2010-02-18 82 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

相關問題