2010-08-31 139 views
1

我有一个WCF服务,我打电话异步。自定义WCF绑定抑制故障

如果我使用wsHttpBinding调用一个抛出正常.Net异常(即不是FaultException)的方法,那么我的WCF通道会处于故障状态 - 这是预期的行为。

然而,如果我请使用自定义的结合方法相同的方法:

<customBinding> 
    <binding name="httpCompressed" sendTimeout="00:10:00" receiveTimeout="00:10:00"> 
     <httpTransport maxBufferSize="2147483647" 
      maxBufferPoolSize="524288" 
      maxReceivedMessageSize="2147483647" /> 
    </binding> 
</customBinding> 

然后,当我收到异常回,信道被留在打开状态。这不是一个预期的行为 - 至少,不是我所知道的。

这是指示customCinding for WCF中的一个bug吗?这实际上是一个预期的行为(如果是这样,指针文档将是非常好的)。

在此先感谢您的帮助。

大卫·穆林 IMA技术

回答

1

这是expexted。 WsHttpBinding默认设置(使用安全会话)使用PerSession实例。这意味着单个服务实例处理来自代理打开通道的所有请求。如果发生未处理的异常,服务实例将被销毁并且通道出现故障。代理服务器无法打开多个通道并且无法启动另一个会话,因此您可以使用故障代理执行的唯一操作是中止它。

您的自定义绑定使用纯HTTP传输而没有任何会话。由于使用PerCall实例化。这意味着来自代理的每个请求都由新的服务实例处理。服务实例在每次通话后释放,故障不会影响通道,因为下次呼叫将由新的服务实例处理。

+0

嗯。鉴于此,我期望明确地改变我的服务的实例如下: 如果我使用wsHttpBinding,我不会再有一个错误的频道了。情况并非如此 - 我尝试了所有不同的实例化/并发性排列,并且我始终如一地得到wsHttpBinding错误的行为,而customBinding没有。 – 2010-09-03 01:08:23

+1

从我的回复中可能不太清楚,但这里重要的是一个会话。即使您在通过自定义绑定公开的服务中使用单实例模式,您仍然没有会话。 – 2010-09-03 07:37:49