2011-04-27 98 views
2

入睡後,我得到了在常規的ASP.NET Web項目申報了WCF REST服務:WCF REST服務進入閒置

[ServiceContract] 
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, IncludeExceptionDetailInFaults = true)] 
public class BasicApp 

我使用它爲iPhone服務層我正在構建的應用程序,所以我使用優秀的ASIHTTPRequest庫來請求它。

服務本身是工作得很好,但是當它已經閒置了約10分鐘的奉獻去睡覺,這最終讓我在iPhone上的超時問題。

如果我通過瀏覽器請求的服務是一樣的,但30秒後左右的服務「喚醒」,然後所有連續請求都非常快。我知道我可以在iPhone上設置超時限制,但對於手持設備來說,這似乎並不是很好。

我猜這是一個配置問題。該服務託管在Win2008R2與IIS 7.5

的IIS網站配置與綜合管線它自己的應用程序池運行.NET Framework 4版。

任何人有一個想法如何解決這個問題?

+0

最可能的原因可能是IIS中的App Pool回收。檢查IIS的AppPool回收設置http://www.iis.net/ConfigReference/system.applicationHost/applicationPools/add/recycling – Chandermani 2011-04-27 09:57:02

回答

3

應用程序池的託管服務定義空閒超時屬性默認爲20分鐘(在IIS管理控制檯應用程序池的高級設置)。如果應用程序池在空閒超時內沒有收到請求,則服務於該池的工作進程將終止。 IIS收到新請求後必須重新啓動該進程,進程必須加載應用程序域和所有相關程序集,編譯.svc文件,運行服務主機並處理請求。

該解決方案可能會增加空閒超時,但此超時的含義是正確處理服務器資源。如果該過程不需要,應該停止。另一個醜陋的解決方法是使用一些ping進程(例如cron作業或服務器上的計劃任務),這將定期ping同一應用程序中的服務或頁面上的某些方法。

編輯:這個答案是過時的 - 這是老版本的IIS其中「AlwaysRunning」選項不可用寫的。請檢查其他答案。

+0

感謝您的解釋。我害怕這是答案:) 現在我會ping服務保持活着。 – 2011-04-27 12:47:17

+0

「解決方案可能會增加空閒超時時間,但此超時的含義是正確處理服務器資源,如果不需要該進程,應該停止。」我只是無法接受。如果需要10分鐘來加載我的服務會怎麼樣?如果我有履行法律義務,該怎麼辦?緩存數據呢?醜陋的東西不是解決方法,它的方法是程序員\ sysadmin不知道什麼是他的特定場景的最佳解決方案。 – 2016-09-15 09:39:26

4

由於您使用的IIS 7.5,你可以打開你的webapp應用程式自動啓動,這將確保該服務保持「活着」。

--larsw

+0

謝謝拉爾斯。我會研究這個。 – 2011-05-03 09:16:01

7

這將告訴您如何設置自動啓動,它爲您的應用程序池

http://msdn.microsoft.com/en-us/library/ee677260.aspx

添加的完整性 C中的applicationHost.config設置:\ WINDOWS \ SYSTEM32 \ INETSRV \ config \ applicationHost.config

<applicationPools> 
    <add name=」MyAppPool」 startMode=」AlwaysRunning」 /> 
</applicationPools> 
15

無需ping您的服務器,這裏是一個屏幕截圖o f在應用程序池的高級設置下進行設置。將啓動模式更改爲始終運行,並停止睡眠。

Change Start Mode to AlwaysRunning

+1

這隻與IIS 8.0相關,因爲IIS 7.5沒有它 – riaandelange 2013-10-16 08:17:20

+1

實際上,它在7.5中可用,只是隱藏在applicationHost.config中。 – Alfred 2014-07-23 10:51:34

-1

artfulhacker得到它正確的。將startMode切換爲AlwaysRunning可使Web服務始終處於活動狀態。我們使用IIS與AAR /服務器場進行負載平衡。 這裏是IIS6的STARTMODE設置的屏幕截圖/ WinServer 2003 IIS6 startMode

0

這裏是beetween創建自託管的WCF Windows服務和禁用應用程序池空閒timeaout和再利用性和Ping服務每分鐘的妥協。

共有2個事件。 5074 - IIS Application Pool Recycling 5186 - IIS Application Pool Recycling

是可能的附加事件處理程序(運行PowerShell腳本)爲這些類型的事件。這裏描述:Trigger a PowerShell Script from a Windows Event

PowerShell腳本:

param($eventRecordID,$eventChannel) 

Start-Sleep -s 1 

$query2 = @" 
    <QueryList><Query Id='0' Path='$eventChannel'><Select Path='$eventChannel'>*[System[(EventRecordID=$eventRecordID)]]</Select></Query></QueryList> 
"@ 

$Events = Get-WinEvent -FilterXml $query2 
if($Events.Count -gt 0) 
{ 
    $evt1 = [xml]$Events[0].toXML() 

    $appPool = $evt1.event.EventData.Data | where { $_.Name -eq 'AppPoolID' } 
    if($appPool) 
    { 
     $appPoolID = $appPool.'#text' 

     switch($appPoolID) 
     { 
      "AppPool" { Invoke-WebRequest -Method Head -Uri http://localhost:8080 } 
      default {} 
     } 
    } 
} 

所以,每個IIS託管服務的時間是要 「睡眠」,你輕輕喚醒它。