2014-01-29 46 views
0

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

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

我不禁觉得双面WCF是sub/pub的糟糕实现。特别是当微软HAS的Sub/pub的实际实现,如SignalR。您甚至可以尝试使用消息队列或ESB。然后你甚至不会关心服务器故障。 – Aron

回答

1

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

一)添加其他功能,正如你提到的“添加新的OnError功能...”,包含该消息的错误标记和字符串,或

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

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

这就是我在做什么...

1

首先,我会考虑一下如果你不要求不使用双面约@Aron想法。

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

  1. 当你建立从客户端的连接 - 订阅频道故障事件:

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

更新时间:

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

EDITED

A和B之间的双工信道为一个快捷方式为客户端B,和B作为客户机A,有效地给你A和B之间双向通信

如果在你的情况下,B需要通知A其订阅已经丢失,那么B可以简单地向A发送请求。FaultExceptions是可序列化的,所以如果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同意这是一个糟糕的实现发布订阅的。

+0

我不认为这是正确的。 IUpdate上的“单向”是服务器到客户端,因此使用你的逻辑错误_should_流向客户端。 – dlanod

+0

似乎我误读了这个问题:-) –

+0

我编辑了我的答案以提供另一种解决方案... –