【问题标题】:WCF REST Service goes to sleep after inactivityWCF REST 服务在不活动后进入睡眠状态
【发布时间】:2011-04-27 08:51:14
【问题描述】:

我有一个在常规 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 框架 v4 和集成管道。

有人知道如何解决这个问题吗?

【问题讨论】:

标签: wcf iis rest


【解决方案1】:

不需要ping你的服务器,这里是应用程序池高级设置下的设置截图。将启动模式更改为 AlwaysRunning,它将停止睡眠。

【讨论】:

  • 这仅与 IIS 8.0 相关,因为 IIS 7.5 没有它
  • 其实在 7.5 中就有,只是隐藏在 applicationHost.config 中。
【解决方案2】:

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

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

为完整性添加 C:\Windows\System32\inetsrv\config\applicationHost.config

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

【讨论】:

    【解决方案3】:

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

    --larsw

    【讨论】:

    • 谢谢拉尔斯。我会调查一下。
    【解决方案4】:

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

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

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

    【讨论】:

    • 感谢您的解释。我担心这就是答案 :) 现在我会 ping 服务以使其保持活力。
    • “解决方案可以是增加空闲超时,但这个超时的含义是正确处理服务器资源。如果不需要该进程,则应停止该进程。”我就是不能接受。如果加载我的服务需要 10 分钟怎么办?如果我有履行的法律义务怎么办?缓存的数据呢?丑陋的事情不是解决方法,它是程序员\系统管理员不知道什么是他特定场景的最佳解决方案的方法。
    【解决方案5】:

    这是创建自托管 WCF Windows 服务和禁用 AppPool 空闲超时和回收属性以及每分钟 Pinging 服务之间的折衷方案。

    有 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 托管服务要“休眠”时,您都会轻轻将其唤醒。

    【讨论】:

      【解决方案6】:

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

      【讨论】:

        猜你喜欢
        • 2019-01-12
        • 1970-01-01
        • 2017-02-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-02
        相关资源
        最近更新 更多