我们在服务中使用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"
答案 0 :(得分:1)
[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single,
ConcurrencyMode =ConcurrencyMode.Multiple)]
指定可用于处理呼叫的服务实例数 传入消息中包含的内容: InstanceContextMode.Single-仅一个InstanceContext对象用于所有传入呼叫,并且不会在呼叫之后回收。如果服务对象不存在,则会创建一个。
指定服务类支持单线程还是支持 多线程操作模式: ConcurrencyMode.Multiple-服务实例是多线程的。不保证同步。由于其他线程可以随时更改您的服务对象,因此您必须始终处理同步和状态一致性。用锁保护您的状态是您的责任。服务实现必须是线程安全的,才能使用此并发模式。
您可以尝试将UseSynchronizationContext = false
添加到ServiceBehavior
中。如果这样做没有帮助,您可以尝试将ReleaseServiceInstanceOnTransactionComplete=true
或false
添加到ServiceBehavior
中。如果InstanceContextMode为多个,我不确定是否可以将其设置为true。
由于具有ConcurrencyMode.Multiple,因此不保证任何同步,并且UseSynchronizationContext的默认值为true,因此它可能试图处理导致该队列的同一线程上的所有调用。
您用来调用服务的代码也可能存在一些问题。没有看到我们就不会知道。
为每个调用增加一个线程可能只需要一点时间?在您的照片中,最长的请求只有5.5秒。 (我知道一个简单的电话就很久了。)