2011-04-27 40 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托管服务的时间是要 “睡眠”,你轻轻唤醒它。