我正在编写一个迷你框架来帮助使用WCF进行客户端 - 服务器连接,我遇到了意外行为。
如果客户端打开一个不可用的服务的通道,然后相对于该服务进行方法调用,则生成的行为会有所不同,具体取决于通道的绑定是否将transferMode设置为“流”。
如果绑定未设置为流并且服务不可用,则WCF会立即引发ICommunicationObject.Faulted事件。另一方面,如果是,WCF会引发ICommunicationObject.Opened事件。
任何人都可以解释这种行为差异的原因吗?看起来很奇怪。
答案 0 :(得分:0)
好吧,我已经研究了几个小时了,并且相信我有一个答案(如果没有人有更好的答案,我会最终将其标记为答案)。
根据msdn上的this article,“所有流媒体呼叫都是通过不支持会话的单个频道(数据报频道)进行的,即使正在使用的绑定配置为使用会话“。 (请注意粗体文本。)虽然我不太清楚在TCP / IP协议上使用数据报通道意味着什么,但我会以面值来看待它。
因此,another msdn article表示“数据报通道是所有消息不相关的通道。对于数据报通道,如果输入或输出操作失败,则下一个操作通常不受影响,并且相同因此,数据报通道通常不会出错。“
所以,显然,流媒体频道根本就没有错。虽然尝试通过通道发送消息会引发套接字异常(因为如果服务不可用,显然无法打开套接字),就WCF而言,这并不意味着通道状态出现故障。即,您仍然可以通过同一个频道发送另一条消息,如果该服务可用,则该消息可能会成功传输。
虽然我觉得奇怪的是,当从未进行套接字连接时,通道的状态被认为是开放的。所以,如果有人对此有更深入的了解,我仍然很乐意听到解释。