C# 请求正在WCF IIS服务器中堆积
我们正在服务中使用C# 请求正在WCF IIS服务器中堆积,c#,wcf,iis,C#,Wcf,Iis,我们正在服务中使用BasicHttpBinding,我们还将并发模式设置为多个,实例上下文模式设置为单个,如下所示 [ServiceBehavior(InstanceContextMode=InstanceContextMode.Single, ConcurrencyMode =ConcurrencyMode.Multiple)] public class Service1 : IService1 我们通过引用在控制台中使用了此服务。我们遇到了一个问题,一段时间后,我们看到消息在IIS工作
BasicHttpBinding
,我们还将并发模式设置为多个,实例上下文模式设置为单个,如下所示
[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single,
ConcurrencyMode =ConcurrencyMode.Multiple)]
public class Service1 : IService1
我们通过引用在控制台中使用了此服务。我们遇到了一个问题,一段时间后,我们看到消息在IIS工作进程中堆积
例如->在1分钟内,它在IIS的工作进程中仅显示为一个线程,但一段时间后,我们在IIS中看到多个请求
有人能帮我们解释一下,为什么过了一段时间,我们看到消息在IIS中排队
下面是配置中的绑定
<binding name="BasicHttpBinding_Common"
closeTimeout="00:10:00" openTimeout="00:10:00"
receiveTimeout="00:10:00" sendTimeout="00:10:00"
allowCookies="false" bypassProxyOnLocal="false"
指定可用于处理呼叫的服务实例数
包含在传入消息中的:
InstanceContextMode.Single-只有一个InstanceContext对象用于所有传入呼叫,并且不会在呼叫后循环使用。如果服务对象不存在,则创建一个服务对象
指定服务类支持单线程还是单线程
多线程操作模式:
多线程-服务实例是多线程的。没有同步保证。因为其他线程可以随时更改您的服务对象,所以您必须始终处理同步和状态一致性。你有责任用锁保卫你的国家。服务实现必须是线程安全的,才能使用此并发模式
您可以尝试将UseSynchronizationContext=false
添加到您的ServiceBehavior
。如果没有帮助,您可以尝试将ReleaseServiceInstanceOnTransactionComplete=true
或false
添加到您的服务行为中。如果InstanceContextMode为多个,我不确定是否可以设置为true
由于使用ConcurrencyMode.Multiple No synchronization担保,并且UseSynchronizationContext的默认值为true,因此它可能试图处理导致队列的同一线程上的所有调用
您用来调用服务的代码也可能存在一些问题。没有看到,我们就不会知道
这可能只是需要一点时间来为每个调用旋转一个线程??在你的图片中,最长的请求只有5.5秒。(我知道这对于一个简单的电话来说太长了。)
这可能也很有启发性:您的代码说您已经将并发设置为single?我已经编辑了这个问题,感谢您指出它。您已经将InstanceContextMode设置为single(默认值为PerSession),这意味着“所有传入呼叫都只使用一个InstanceContext对象,并且在呼叫之后不会被回收”。所以它基本上创建了一个队列。如果只有一个请求出错,永远不会返回,或者需要很长时间才能返回,那么所有其他请求都会堆积起来。例如,我已经阅读了多篇文章-当实例模式为single时,将在服务器端创建single server实例,使用相同且唯一的实例,所有客户端都将进行通信。这里的并发模式是多线程的,因此服务器中的多个线程管理所有请求。这对我来说没有意义,因为由于并发性,多线程可以在服务器级别处理我的请求,但对于相同的代码,在1分钟的时间间隔后,我看到的是两个数字的乘积。怎么可能呢?
[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single,
ConcurrencyMode =ConcurrencyMode.Multiple)]