WCF REST服务在不活动后进入休眠状态

时间:2011-04-27 08:51:14

标签: wcf iis rest

我有一个在常规ASP.NET Web项目中声明的WCF REST服务:

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

我正在使用它作为我正在构建的iPhone应用程序的服务层,因此我使用优秀的ASIHTTPRequest库请求它。

服务本身工作得很好,但是当它闲置大约10分钟时,服务似乎就会进入休眠状态,这最终会让我在iPhone上出现超时问题。

如果我通过浏览器请求服务它是相同的,但是在30秒左右之后服务“唤醒”,然后所有连续请求都非常快。我知道我可以提高iPhone的超时限制,但对于手持设备来说这似乎并不是很好。

我猜这是配置问题。该服务托管在带有IIS 7.5的Win2008R2上

IIS网站配置了自己的AppPool,运行带有集成管道的.NET framework v4。

任何人都知道如何解决这个问题?

6 个答案:

答案 0 :(得分:17)

无需ping服务器,以下是应用程序池高级设置下的设置屏幕截图。将启动模式更改为AlwaysRunning,它将停止睡眠。

Change Start Mode to AlwaysRunning

答案 1 :(得分:7)

这告诉您如何设置自动启动,它在appPool的applicationHost.config设置中

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

添加完整性 C:\ Windows \ System32下\ INETSRV \设置\的applicationHost.config

<applicationPools>
    <add name=”MyAppPool” startMode=”AlwaysRunning” />
</applicationPools>

答案 2 :(得分:4)

由于您使用的是IIS 7.5,因此可以在您的webapp上启用应用程序自动启动,这将确保服务保持“活跃”状态。

- larsw

答案 3 :(得分:3)

托管您的服务的应用程序池定义了Idle Time-out属性(IIS管理控制台中应用程序池的高级设置),默认为20分钟。如果应用程序池在空闲超时内未收到任何请求,则终止服务池的工作进程。在收到新请求后,IIS必须再次启动该进程,该进程必须加载应用程序域和所有相关程序集,编译.svc文件,运行服务主机并处理请求。

解决方案可能会增加空闲超时,但此超时的含义是正确处理服务器资源。如果不需要该过程,则应停止该过程。另一个丑陋的解决方法是使用一些ping进程(例如服务器上的cron作业或计划任务),它会定期ping同一应用程序中服务或页面上的某些方法。

编辑:这个答案已经过时 - 它是为旧的IIS版本编写的,其中“AlwaysRunning”选项不可用。请检查其他答案。

答案 4 :(得分:0)

以下是创建自托管WCF Windows服务和每分钟禁用AppPool空闲时间和回收属性以及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托管服务“睡眠”时,您都会轻轻将其唤醒。

答案 5 :(得分:-1)

artfulhacker说得对。将startMode切换为AlwaysRunning允许Web服务始终处于活动状态。我们将IIS与AAR / Server Farms一起用于负载平衡。 以下是IIS6 / WinServer 2003中startMode设置的屏幕截图。 IIS6 startMode