当向我的WCF服务发送100个HTTP请求时,WCF框架仅接收和发送11个请求,因为我的后端代码一次将并发处理限制为10个请求。
根据Fiddler的说法,第12个HTTP请求实际上甚至没有在传输层接收。
我为服务器端的每个请求模拟了5秒的处理时间。一旦处理了前10个请求中的一个并且第11个请求的处理已经开始,就会从网络套接字读取第12个请求。
我想监控当前有多少请求待处理。最终,我想在队列超过一定限制后拒绝新的请求。
WCF服务配置如下(PSEUDO代码):
ServiceBehaviorAttribute.ConcurrencyMode = ConcurrencyMode.Multiple
ServiceBehaviorAttribute.InstanceContextMode = InstanceContextMode.Single
ServiceThrottlingBehavior.MaxConcurrentCalls = int.MaxValue
ServiceThrottlingBehavior.MaxConcurrentInstances = int.MaxValue
ServiceThrottlingBehavior.MaxConcurrentSessions= int.MaxValue
此外,我添加了一个自定义合约行为来应用我自己的固定大小的线程池进行请求处理(使用.NET线程池时行为几乎相同):
void IContractBehavior.ApplyDispatchBehavior(
ContractDescription contractDescription,
ServiceEndpoint endpoint,
DispatchRuntime dispatchRuntime)
{
dispatchRuntime.SynchronizationContext = SYNCHRONIZER;
}
其中SYNCHRONIZER是一个派生自SynchronizationContext并覆盖" Post"的类。实际排队工作项的方法。
有人可以解释观察到的行为吗?