Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 请求正在WCF IIS服务器中堆积_C#_Wcf_Iis - Fatal编程技术网

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)]