如何在回调通道上抛出通知客户端故障?

时间:2014-01-29 02:06:40

标签: c# wcf error-handling duplex

我有一个双工通道,它使用回调来提供更新,作为订阅某些数据的一部分(参见下面的接口)。有时候数据不可用,当服务器需要关闭其订阅并让客户端打开一个新订单时,我想通知客户端它需要这样做。

  • 这样做的正确方法是什么?
  • 是否可以通过IUpdate接口传回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);
}

3 个答案:

答案 0 :(得分:1)

使用你在那里,在主机和客户端之间发送(字符串更新),你不能抛出并捕获错误。根据我的经验,你需要:

a)添加另一个函数,因为你建议“添加一个新的OnError函数......”,包含错误标志和消息字符串,或者

b)将OnUpdate函数中的String更改为包含返回字符串的对象,还包括bError标志,错误消息的字符串或可能是Exception对象。

然后,当客户端循环并侦听入站消息时,请检查新函数或对象是否存在错误情况。

这就是我正在做的......

答案 1 :(得分:1)

首先,如果不需要,我会考虑@Aron关于不使用双工的想法。

如果你这样做,我会尝试以下步骤:

  1. 当您与客户建立连接时 - 订阅频道故障事件:

    ((IClientChannel)my_ISubscribe_channel).Faulted += Server_Channel_Faulted;
    
  2. 实施Server_Channel_Faulted方法以重新连接到服务器。请务必在服务器上更新您的订阅。

  3. 更新:

    1. 如果服务器应该是重新连接的发起者,则可以在客户端回调上添加方法,这将强制重新连接到服务器。

答案 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的糟糕实现。