在WCF IIS服务器中堆积请求

时间:2018-12-25 07:40:16

标签: c# wcf 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" 

enter image description here

1 个答案:

答案 0 :(得分:1)

[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single,
 ConcurrencyMode =ConcurrencyMode.Multiple)]
  

指定可用于处理呼叫的服务实例数   传入消息中包含的内容:   InstanceContextMode.Single-仅一个InstanceContext对象用于所有传入呼叫,并且不会在呼叫之后回收。如果服务对象不存在,则会创建一个。

     

指定服务类支持单线程还是支持   多线程操作模式:   ConcurrencyMode.Multiple-服务实例是多线程的。不保证同步。由于其他线程可以随时更改您的服务对象,因此您必须始终处理同步和状态一致性。用锁保护您的状态是您的责任。服务实现必须是线程安全的,才能使用此并发模式。

您可以尝试将UseSynchronizationContext = false添加到ServiceBehavior中。如果这样做没有帮助,您可以尝试将ReleaseServiceInstanceOnTransactionComplete=truefalse添加到ServiceBehavior中。如果InstanceContextMode为多个,我不确定是否可以将其设置为true。

由于具有ConcurrencyMode.Multiple,因此不保证任何同步,并且UseSynchronizationContext的默认值为true,因此它可能试图处理导致该队列的同一线程上的所有调用。

您用来调用服务的代码也可能存在一些问题。没有看到我们就不会知道。

为每个调用增加一个线程可能只需要一点时间?在您的照片中,最长的请求只有5.5秒。 (我知道一个简单的电话就很久了。)

这可能也没有意义:https://stackoverflow.com/a/4698956/2016162