C# WCF:如何识别挂起的HTTP请求 观察到的行为(示例):
当向我的WCF服务发送100个HTTP请求时,WCF框架只接收和发送11个请求,因为我的后端代码将并发处理限制为一次10个请求 根据Fiddler的说法,第12个HTTP请求实际上甚至在传输级别上都没有收到 我对服务器端的每个请求模拟了5秒的处理时间。一旦前10个请求中的一个已被处理且第11个请求的处理已开始,则从网络套接字读取第12个请求 问题 我想监控当前有多少请求处于挂起状态。最后,我希望在队列超过某个限制后拒绝新请求 测试设置 WCF服务的配置如下(伪代码): 此外,我还添加了一个自定义契约行为,以应用我自己的固定大小线程池进行请求处理(使用.NET线程池时的行为几乎相同): 其中SYNCHRONIZER是一个从SynchronizationContext派生的类,它重写“Post”方法以实际使工作项排队 笔记C# WCF:如何识别挂起的HTTP请求 观察到的行为(示例):,c#,wcf,request,queue,C#,Wcf,Request,Queue,当向我的WCF服务发送100个HTTP请求时,WCF框架只接收和发送11个请求,因为我的后端代码将并发处理限制为一次10个请求 根据Fiddler的说法,第12个HTTP请求实际上甚至在传输级别上都没有收到 我对服务器端的每个请求模拟了5秒的处理时间。一旦前10个请求中的一个已被处理且第11个请求的处理已开始,则从网络套接字读取第12个请求 问题 我想监控当前有多少请求处于挂起状态。最后,我希望在队列超过某个限制后拒绝新请求 测试设置 WCF服务的配置如下(伪代码): 此外,我还添加了一个自定义
- 我测试了客户端:并发地向服务发送100个HTTP请求没有问题。如果我将服务器端工作线程数增加到100,所有请求都会立即传输,整个测试执行时间为5秒
- System.ServiceModel中的Windows性能计数器“调用未完成”显示已调度请求的数量(因此它没有用处)
- 我尝试附加不同的性能分析器。但他们并没有引导我找到神秘的代码位置,线程在那里阻止请求接收
ServiceBehaviorAttribute.ConcurrencyMode = ConcurrencyMode.Multiple
ServiceBehaviorAttribute.InstanceContextMode = InstanceContextMode.Single
ServiceThrottlingBehavior.MaxConcurrentCalls = int.MaxValue
ServiceThrottlingBehavior.MaxConcurrentInstances = int.MaxValue
ServiceThrottlingBehavior.MaxConcurrentSessions= int.MaxValue
void IContractBehavior.ApplyDispatchBehavior(
ContractDescription contractDescription,
ServiceEndpoint endpoint,
DispatchRuntime dispatchRuntime)
{
dispatchRuntime.SynchronizationContext = SYNCHRONIZER;
}