C# 如何在回调通道上抛出通知客户端错误?
我有一个双工通道,它使用回调提供更新,作为某些数据订阅的一部分(见下面的接口)。有时,数据不可用,服务器需要关闭其订阅并让客户端打开一个新的订阅,因此我想通知客户端它需要这样做C# 如何在回调通道上抛出通知客户端错误?,c#,wcf,error-handling,duplex,C#,Wcf,Error Handling,Duplex,我有一个双工通道,它使用回调提供更新,作为某些数据订阅的一部分(见下面的接口)。有时,数据不可用,服务器需要关闭其订阅并让客户端打开一个新的订阅,因此我想通知客户端它需要这样做 正确的方法是什么 是否可以通过IUpdate接口传回故障异常?似乎抛出了新的FaultException(…)语法特定于请求-响应 我是否需要以某种方式返回自定义错误 我是否只需要添加一个新的OnError函数或类似的函数来明确地强制客户端重新连接 使用现有的,在主机和客户端之间发送(字符串更新),您不能抛出并捕获
- 正确的方法是什么
- 是否可以通过IUpdate接口传回
?似乎故障异常
抛出了新的FaultException(…)代码>语法特定于请求-响应
- 我是否需要以某种方式返回自定义错误
- 我是否只需要添加一个新的
函数或类似的函数来明确地强制客户端重新连接OnError
使用现有的,在主机和客户端之间发送(字符串更新),您不能抛出并捕获错误。根据我的经验,您需要: a) 添加另一个函数,如您建议的“添加新的OneError函数…”,其中包含消息的错误标志和字符串,或 b) 将OnUpdate函数中的字符串更改为包含返回字符串的对象,但也包含错误标志、错误消息字符串或异常对象 然后,当客户端循环并侦听入站消息时,检查新函数或对象是否存在错误条件
这就是我正在做的首先,如果不需要的话,我会考虑@ Aron不使用双工的想法。 如果您这样做,我将尝试以下步骤:
((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);
}