【问题标题】:Custom WCF Binding Suppresses Fault自定义 WCF 绑定抑制故障
【发布时间】:2011-04-06 09:35:22
【问题描述】:

我有一个异步调用的 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>

然后,当我收到异常返回时,通道仍处于打开状态。这不是预期的行为 - 至少据我所知不是。

这是否表示 WCF 的 customBinding 中存在错误?这实际上是预期的行为吗(如果是这样,指针文档会很好)。

提前感谢您的帮助。

大卫·穆林 IMA 技术

【问题讨论】:

    标签: wcf wcf-binding


    【解决方案1】:

    这是过期的。默认设置(带有安全会话)中的 WsHttpBinding 使用 PerSession 实例化。这意味着单个服务实例处理来自代理打开通道的所有请求。如果发生未处理的异常,则服务实例被破坏并且通道出现故障。代理不能打开多个通道,也不能启动另一个会话,因此您对故障代理唯一能做的就是中止它。

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

    【讨论】:

    • 嗯。鉴于此,我希望明确更改我的服务的实例如下: [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple, UseSynchronizationContext = false)] 会这样,如果我使用 wsHttpBinding,我会不再以故障通道告终。事实并非如此 - 我已经尝试了所有不同的实例化/并发排列,并且我始终得到 wsHttpBinding 错误的行为,而 customBinding 没有。
    • 我的回答可能不清楚,但这里重要的是会话。即使您在通过自定义绑定公开的服务中使用单实例模式,您仍然没有会话。
    猜你喜欢
    • 2014-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多