我正在对在某个时刻挂起的WCF服务进行故障排除。 服务行为如下:
[ServiceBehavior( InstanceContextMode = InstanceContextMode.PerCall, ConcurrencyMode = ConcurrencyMode.Multiple )]
限制参数是:
<serviceThrottling maxConcurrentCalls="50" maxConcurrentSessions="50" maxConcurrentInstances="50" />
以下是从挂起转储中获取的服务状态:
0:000> !mdt 0000000000c9f270 -r
0000000000c9f270 (System.ServiceModel.Dispatcher.ServiceThrottle)
calls:0000000000c9f3d8 (System.ServiceModel.Dispatcher.FlowThrottle)
capacity:0x32 (System.Int32)
count:0x32 (System.Int32)
mutex:0000000000c9f418 (System.Object)
<NO FIELDS>
release:0000000000c9f398 (System.Threading.WaitCallback)
_target:0000000000c9f270 (System.ServiceModel.Dispatcher.ServiceThrottle)
<RECURSIVE>
_methodBase:NULL (System.Reflection.MethodBase)
_methodPtr:0000064273dddf30 (System.IntPtr)
_methodPtrAux:0000000000000000 (System.IntPtr)
_invocationList:NULL (System.Object)
_invocationCount:0000000000000000 (System.IntPtr)
<NO FIELDS>
waiters:0000000000c9f430 (System.Collections.Generic.Queue`1[[System.Object, mscorlib]])
_array:0000000028d73e70 (System.Object[], Elements: 16)
_head:0x1 (System.Int32)
_tail:0xA (System.Int32)
_size:0x9 (System.Int32)
_version:0x22 (System.Int32)
_syncRoot:NULL (System.Object)
propertyName:0000000000c9f2b8 (System.String: "MaxConcurrentCalls")
configName:0000000000c9f358 (System.String: "maxConcurrentCalls")
sessions:0000000000c9f508 (System.ServiceModel.Dispatcher.FlowThrottle)
capacity:0x32 (System.Int32)
count:0x9 (System.Int32)
....
instanceContexts:000000000105ffc8 (System.ServiceModel.Dispatcher.FlowThrottle)
capacity:0x32 (System.Int32)
count:0x32 (System.Int32)
正如您所看到的,maxConcurrentCalls已经用尽,而会话数只有9。 我想知道这是否可能是由客户端代码中有关代理使用情况的故障引起的,例如糟糕的异常处理?
考虑到服务的内存转储,有没有办法找到客户端IP地址?
TIA。
答案 0 :(得分:2)
找到问题的根源。 由于服务代码中的死锁,MaxConcurrentCalls已经用尽。 我们正在使用c#lock关键字,似乎有时在锁定保护的代码中发生奇怪的事情时,锁不会被释放...
无论如何,感谢为这个主题做出贡献的每个人。
答案 1 :(得分:0)
这可能是超时和你如何使用wcf代理/调用wcf服务的组合。
想法是,当你打电话给服务时,你不会告诉服务关闭,然后连接会一直持续到10分钟后超时。因此,您可以每分钟拨打10个电话,仅需1秒,但在10分钟后您可以进行100个并发连接。
使用“using”语句创建代理通常会修复此问题。
答案 2 :(得分:0)
我猜这是因为您正在使用块创建客户端。见What is the best workaround for the WCF client `using` block issue?