使用msmq绑定和closeTimeout的WCF服务?

时间:2010-02-15 15:37:42

标签: wcf msmq

我正在努力加速我们环境中的大量集成测试。

我现在面临的问题是,在测试之间的拆解过程中,使用msmq绑定的一个WCF服务大约需要1分钟才能关闭。

我的拆卸过程我们遍历我们的servicehosts,调用具有非常短的超时的Close()方法,覆盖WCF配置中的closeTimeout值。这适用于net.tcp绑定,但使用msmq的一个服务仍然需要1分钟才能关闭。 closeTimeout似乎没有任何效果。

对于测试服务,配置看起来像这样:

<netMsmqBinding>
    <binding name="NoMSMQSecurity" closeTimeout="00:00:01" timeToLive="00:00:05" 
             receiveErrorHandling="Drop" maxRetryCycles="2" retryCycleDelay="00:00:01" receiveRetryCount="2">
      <security mode="None" />
    </binding>
  </netMsmqBinding>

我使用的结束通话就像这样:

service.Close(new TimeSpan(0, 0, 0, 0, 10));

我可以采用另一种方法来更快地关闭servicehost吗?

由于这是一个自动测试,此时已成功或失败,我不想等待任何其他未经处理的消息或类似消息。

致以最诚挚的问候,

Per Salmi

2 个答案:

答案 0 :(得分:1)

我找到了使用Msmq延迟关闭服务主机的原因。

长时间关闭的原因似乎是该服务使用另一个基于net.tcp的服务,该服务已激活reliableSession和servicehost。 reliableSession设置将非活动超时设置为5分钟,这会导致它发送保持活动的基础结构消息,它们应每2.5分钟发送一次。这种保持活跃的消息传递间隔似乎导致基于msmq的服务闲置1-2分钟,可能等待一些保持活动的消息到达。

当我将inactivityTimeout设置为5秒时,msmq服务的关闭在大约2.5秒内完成。这使自动集成测试通过更快!

答案 1 :(得分:0)

是否会有一些阻止关闭的交易。

比如说有一个打开的事务,如果你在没有提交事务的情况下关闭,那么它将等待1分钟以使事务超时,然后才能关闭。