我们在IIS 6.0上托管WCF服务的其中一台服务器上观察到以下行为:
我发现sc-win32-status code of 64表示“指定的网络不再可用”
最初我怀疑它可能是因为在MinFileBytesPerSecond上设置了限制,它设置了HTTP.sys在将数据从客户端发送到服务器以及从服务器返回到客户端时强制执行的最小吞吐率。但是sc-bytes和cs-bytes的值表示发送的数据量在通常为服务观察的范围内。
另请注意,WCF服务托管在四个盒子上并且是负载平衡的,但问题只发生在其中一个服务器上。 (但基本上不在同一台服务器上)。问题也是间歇性的。
有没有其他人遇到过这个错误?关于什么可能是错的任何线索?
更新 注意:观察IIS 7.5(IIS版本并不重要) 我能够复制这个问题。如果出现以下问题: 1. WCF服务需要很长时间才能响应 2.客户端代理在收到服务器响应之前超时。在这种情况下,它会导致客户端上出现TimeoutException。 3.服务器一直在等待客户端的TCP ACK,它永远不会收到。 因此,超时超时(TCP套接字超时(默认值:4分钟)和sc-win32-status为64
所以基本上看起来WCF代码需要很长时间才能响应并且客户端超时,我在IIS日志中观察到的只是一个症状而不是问题。
如果超出WCF服务的最大会话数,调用数或实例数(取决于您配置服务实例上下文模式的方式),也会出现您描述的行为。如果您观察到%max并发会话和/或%max并发调用的System.ServiceModel性能计数器(同样取决于您的服务的实例上下文),您可能会看到与IIS日志条目的关联。
请注意,可以在服务限制行为中配置这些最大值。
我再次看到了你的问题,并想指出我找到了解决方案。原来这是web.config中的这段代码:
<pages smartNavigation="true">
关闭此功能后,我停止接收相同的超时错误。另见the answer here
IIS将服务置于睡眠状态以节省资源。
从这里复制(WCF REST Service goes to sleep after inactivity)
托管服务的应用程序池定义“空闲超时”属性(IIS管理控制台中应用程序池的高级设置),默认为20分钟。如果应用程序池在空闲超时内未收到任何请求,则终止服务池的工作进程。在收到新请求后,IIS必须再次启动该进程,该进程必须加载应用程序域和所有相关程序集,编译.svc文件,运行服务主机并处理请求。解决方案可以增加空闲超时但意义此超时是正确处理服务器资源。如果不需要该过程,则应停止该过程。另一个丑陋的解决方法是使用一些ping进程(例如服务器上的cron作业或计划任务),它将定期ping同一应用程序中的服务或页面上的某些方法。