我有一个双工通道,它使用回调来提供更新,作为订阅某些数据的一部分(参见下面的接口)。有时候数据不可用,当服务器需要关闭其订阅并让客户端打开一个新订单时,我想通知客户端它需要这样做。
FaultException
?似乎throw new FaultException(...);
语法特定于请求 - 响应。OnError
函数或类似函数?
[ServiceContract(Namespace = "http://tempura.org/ISubscribe", Name = "ISubscribe", ConfigurationName = "Subscribe", CallbackContract = typeof(IUpdate))]
interface ISubscribe
{
[OperationContract]
long Subscribe();
[OperationContract(IsOneWay = true)]
void Unsubscribe(long index);
}
[ServiceContract(Namespace = "http://tempura.org/ISubscribe")]
public interface IUpdate
{
[OperationContract(IsOneWay = true)]
void OnUpdate(string update);
}
答案 0 :(得分:1)
使用你在那里,在主机和客户端之间发送(字符串更新),你不能抛出并捕获错误。根据我的经验,你需要:
a)添加另一个函数,因为你建议“添加一个新的OnError函数......”,包含错误标志和消息字符串,或者
b)将OnUpdate函数中的String更改为包含返回字符串的对象,还包括bError标志,错误消息的字符串或可能是Exception对象。
然后,当客户端循环并侦听入站消息时,请检查新函数或对象是否存在错误情况。
这就是我正在做的......
答案 1 :(得分:1)
首先,如果不需要,我会考虑@Aron关于不使用双工的想法。
如果你这样做,我会尝试以下步骤:
当您与客户建立连接时 - 订阅频道故障事件:
((IClientChannel)my_ISubscribe_channel).Faulted += Server_Channel_Faulted;
实施Server_Channel_Faulted方法以重新连接到服务器。请务必在服务器上更新您的订阅。
更新:
答案 2 :(得分:0)
<强> EDITED 强>
A和B之间的双工通道是A作为客户端到B的快捷方式,B是客户端到A的快捷方式,有效地为您提供A和B之间的双向通信。
如果在你的情况下,B需要通知A其订阅丢失,B可以简单地向A发送请求.QaultExceptions是可序列化的,所以如果A确实需要知道B中出了什么问题,B可以简单地传递一个消息中的FaultException。
您的回调合约将成为:
[ServiceContract(Namespace = "http://tempura.org/ISubscribe")]
public interface IUpdate
{
[OperationContract(IsOneWay = true)]
void OnUpdate(string update);
[OperationContract(IsOneWay = true)]
void OnSubscriptionLost(FaultException exception);
}
但我同意@Aron的说法,这是pubsub的糟糕实现。