我无法将故障 channel 的概念映射回某些绑定(bind)的手动实现。我认为这个 WCF 功能很烦人,我想知道是否有任何方法可以禁用它。

以 TCP 为例。大多数 TCP 通信断开。那么到底为什么一个连接会导致 channel 故障并破坏所有以下连接?

和命名管道?

也许我错了。所以请解释为什么它是一个功能,而不是一个错误。

最佳答案

FaultedCommunicationObject 状态机的一种状态,它被烘焙到许多 WCF 抽象的实现中。它本质上意味着该对象的“游戏结束”,因此您不会找到任何禁用它的方法。

这当然不是错误:所有这些人工制品背后的 CommunicationObject 状态机是有意识的设计选择。虽然讨论 WCF 架构师所做的设计决策可能会引起人们的兴趣,但如果您想使用 WCF,最终您只需要接受事情的现状并继续前进。

您应该认为 channel 不仅仅是所使用传输的适配器:它是一个更高级别的抽象,它包含了通信堆栈中的许多不同层(传输、编码、安全、 session 管理、事务流、双工等)。

即使查看特定绑定(bind)的详细信息,您也会发现堆栈中很少有容错元素可以在先前的通信尝试失败后安全地重用它们(例如 HTTP 协议(protocol))。即使是您提到的那些(TCP,命名管道)也不如您建议的那样容错。

我认为 CommunicationObject 状态机或类似的东西或多或少是必不可少的,以便拥有一个比其所有组成层/元素的细节更高级的 channel 抽象。它启用了一个简单的规则:如果它是 Faulted ,则将其丢弃并创建一个新的。是的,在某些情况下,您可能会错过通过保留一些可以安全重用的资源来实现的优化;但这是您为使用更简单的通信抽象而支付的(小)成本。

关于.net - WCF channel 故障状态有帮助吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5145398/

10-16 04:20
查看更多