C# 如何在回调通道上抛出通知客户端错误?

C# 如何在回调通道上抛出通知客户端错误?,c#,wcf,error-handling,duplex,C#,Wcf,Error Handling,Duplex,我有一个双工通道,它使用回调提供更新,作为某些数据订阅的一部分(见下面的接口)。有时,数据不可用,服务器需要关闭其订阅并让客户端打开一个新的订阅,因此我想通知客户端它需要这样做 正确的方法是什么 是否可以通过IUpdate接口传回故障异常?似乎抛出了新的FaultException(…)语法特定于请求-响应 我是否需要以某种方式返回自定义错误 我是否只需要添加一个新的OnError函数或类似的函数来明确地强制客户端重新连接 使用现有的,在主机和客户端之间发送(字符串更新),您不能抛出并捕获

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

  • 正确的方法是什么
  • 是否可以通过IUpdate接口传回
    故障异常
    ?似乎
    抛出了新的FaultException(…)语法特定于请求-响应
  • 我是否需要以某种方式返回自定义错误
  • 我是否只需要添加一个新的
    OnError
    函数或类似的函数来明确地强制客户端重新连接


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

a) 添加另一个函数,如您建议的“添加新的OneError函数…”,其中包含消息的错误标志和字符串,或

b) 将OnUpdate函数中的字符串更改为包含返回字符串的对象,但也包含错误标志、错误消息字符串或异常对象

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


这就是我正在做的 如果您这样做,我将尝试以下步骤:

  • 从客户端建立连接时-订阅通道故障事件:

    ((IClientChannel)my_ISubscribe_channel).Faulted += Server_Channel_Faulted;
    
  • 实现服务器\通道\故障方法以重新连接到服务器。请确保在服务器上更新您的订阅

  • 更新:

  • 若服务器应该是重新连接的发起方,那个么您可以在客户端回调上添加方法,该方法将强制重新连接到服务器

  • 已编辑

    A和B之间的双工通道是A作为客户端到B,B作为客户端到A的快捷方式,有效地提供A和B之间的双向通信

    在您的情况下,如果B需要通知A其订阅已丢失,B可以简单地向A发送请求。FaultException是可序列化的,因此如果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实现。

    我忍不住觉得双工WCF是一个糟糕的sub/pub实现。特别是当微软有sub/pub的实际实现时,比如SignalR。您甚至可以尝试使用消息队列或ESB。那你根本不在乎服务器坏了。我认为这是不对的。IUpdate上的“单向”是服务器到客户端,因此使用您的逻辑,故障应该流向客户端。
    [ServiceContract(Namespace = "http://tempura.org/ISubscribe")]
    public interface IUpdate
    {
        [OperationContract(IsOneWay = true)]
        void OnUpdate(string update);
    
        [OperationContract(IsOneWay = true)]
        void OnSubscriptionLost(FaultException exception);
    }