我在WCF服务中间歇性挂起。通常需要几毫秒的呼叫在服务恢复之前开始需要30秒或更长的时间才能完成。然而,所有呼叫都成功完成。 New Relic报告请求中的所有时间都花在ExecuteRequestHandler上。
我在服务器上为所有请求启用了失败的请求跟踪,并观察和等待。当站点开始悬挂时,我将轨迹拉下来,我看到以下是典型的:
136 - GENERAL_SET_RESPONSE_HEADER
HeaderName:Content-Length HeaderValue:2237 替换:false
信息
273281 ms
日志中的所有其他步骤的时间均为0毫秒。挂起功能各不相同,当服务正常运行时,具有完全相同的参数和响应有效负载的完全相同的功能表现得非常完美。似乎当网站开始挂起时,所有请求都会被阻止,直到恢复为止。
任何人都可以建议我从这里开始。
由于
答案 0 :(得分:0)
从我的角度来看,这是一种方式,非常烦人。 New Relic说这个服务挂在ExecuteRequestHandler上,我潜入了一个试图诊断悬挂的兔子洞。
最终解决方案是调整WCF服务的限制配置:
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="...">
<serviceThrottling maxConcurrentCalls="512" maxConcurrentSessions="3200" maxConcurrentInstances="3712" />
事实证明,即使没有此条目,WCF服务也会默认受限制,最近MS增加了默认值。我的服务在大约200转每分钟下降(我认为这并不过分)。我使用的值是新默认值的8倍,现在一切都运行得非常好。
为什么服务受到限制,并且没有迹象表明这种情况发生在我不知道的默认配置条目中。 WCF一直是配置地狱,我已经决定永远不再使用它。 Web API来自此处。
希望有一天能帮到某人:)