我有一个在常规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。
任何人都知道如何解决这个问题?
答案 0 :(得分:17)
无需ping服务器,以下是应用程序池高级设置下的设置屏幕截图。将启动模式更改为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)