19

我们在 IIS 6.0 上托管 WCF 服务的服务器之一上观察到以下行为:

  1. IIS 日志显示所用时间的值很高 (> 100000)
  2. HTTP 状态码是 200
  3. sc-win32-status 代码显示值为 64

我发现sc-win32-status 代码为 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日志中观察到的只是一个症状而不是问题。

4

3 回答 3

1

如果您超过 WCF 服务的最大会话、调用或实例(取决于您如何配置服务实例上下文模式),您所描述的行为也会发生。如果您观察 %max 并发会话和/或 %max 并发调用的 System.ServiceModel 性能计数器(同样取决于您的服务的实例上下文),您可能会看到与 IIS 日志条目的相关性。

请注意,可以在服务限制行为中配置这些最大值。

https://msdn.microsoft.com/en-us/library/vstudio/system.servicemodel.description.servicethrottlingbehavior(v=vs.100).aspx

于 2015-03-31T15:15:49.773 回答
0

IIS 使服务进入睡眠状态以节省资源。

从这里复制(WCF REST 服务在不活动后进入睡眠状态

托管服务的应用程序池定义空闲超时属性(IIS 管理控制台中应用程序池的高级设置),默认为 20 分钟。如果应用程序池在空闲超时内没有收到请求,则终止为池服务的工作进程。IIS收到新请求后必须重新启动进程,该进程必须加载应用程序域和所有相关程序集,编译.svc文件,运行服务主机并处理请求。解决方法可以是增加空闲超时但含义这个超时是正确处理服务器资源。如果不需要该过程,则应停止该过程。另一个丑陋的解决方法是使用一些 ping 进程(例如服务器上的 cron 作业或计划任务),它会定期 ping 调用同一应用程序中服务或页面上的某些方法。

于 2013-06-15T10:41:11.037 回答
0

我再次看到您的问题,并想指出我找到了解决方案。原来是web.config中的这段代码:

     <pages smartNavigation="true">

关闭此功能后,我不再收到相同的超时错误。另请参阅此处的答案

于 2013-09-12T19:37:30.563 回答