如何使用 WCF NetHttpBinding(WebSockets)通过服务器向所有客户端广播(推送)一个客户端发送的消息?

Posted

技术标签:

【中文标题】如何使用 WCF NetHttpBinding(WebSockets)通过服务器向所有客户端广播(推送)一个客户端发送的消息?【英文标题】:How to broadcast (push) a message send by one client, to all clients through a server using WCF NetHttpBinding (WebSockets)? 【发布时间】:2012-11-09 15:31:42 【问题描述】:

在 .NET 4.5 中,引入了一个新的 WCF 绑定 NetHttpBinding,它使用 WebSocket 协议作为其底层传输。这意味着这可以实现从服务器的真正推送。现在,我已经能够使用这样的回调合约进行某种推送:

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)]
public class WebSocketSampleService : IDuplexContract

    public string SayHelloDuplex()
    
        //push to the current caller
        OperationContext.Current.
            GetCallbackChannel<IDuplexCallbackContract>().
            SayingHello("Hello from WebSockets");

        //answer the current caller in the regular http way
        return "Hello";
    

[ServiceContract(CallbackContract=typeof(IDuplexCallbackContract))]
public interface IDuplexContract

    [OperationContract]
    string SayHelloDuplex(string name);

[ServiceContract]
public interface IDuplexCallbackContract

    [OperationContract]
    void SayingHello(string message);

不过,我想做的是在单个客户端调用方法SayHelloDuplex() 时向所有客户端广播消息。有没有办法访问所有客户端的回调通道?或者我应该记录所有客户端的回调通道以供以后在其他方法中使用(例如Connect())?也许我以错误的方式解决了这个问题?

任何帮助将不胜感激。谢谢

【问题讨论】:

不是您具体问题的答案,但这听起来像是 SignalR 可以让您的生活更轻松的场景。里程会有所不同... @JeffBrand-MSFT 谢谢。我正在学院做我的主要学期项目。我分析了在 .NET 中实现实时通信的方法。我已经写过 SignalR 以及它如何让我的生活更轻松。这是一个我也想分析的替代方案。 【参考方案1】:

每个客户端的回调通道都是唯一的,因此无法访问所有客户端的回调通道。

相反,您应该将每个客户端的回调通道保存在列表中,甚至更好地保存在字典中,以便您可以针对特定客户端。

然后,当您想向所有客户端广播消息时,只需查看列表即可。

【讨论】:

以上是关于如何使用 WCF NetHttpBinding(WebSockets)通过服务器向所有客户端广播(推送)一个客户端发送的消息?的主要内容,如果未能解决你的问题,请参考以下文章

WCF RESTFul服务中的异常处理

在 WCF 的代码中将 IncludeExceptionDetailInFaults 设置为 true

当 Fiddler 运行 .Net 4.5 时,WCF 服务正在工作

WCF REST 完整服务中的异常处理

如何从托管在另一台服务器上的 Web 应用程序调用客户端计算机托管的 Wcf 服务?

通过 DI 的 WCF 构造函数服务类型