【问题标题】:Creating multiple Signalr hub proxies in a .Net client在 .Net 客户端中创建多个 Signalr 集线器代理
【发布时间】:2014-02-02 10:19:18
【问题描述】:

我开始使用 SignalR(.Net 客户端),在我目前看到的示例中,他们创建连接,然后创建集线器代理,然后启动连接,例如:-

var hubConnection = new HubConnection("http://localhost:8080/");

var fooProxy = hubConnection.CreateHubProxy("FooHub");
var barProxy = hubConnection.CreateHubProxy("BarHub");

hubConnection.Start().Wait();

// The proxies can now be used

我的服务器将由多个集线器组成(主要向客户端提供请求-响应式操作),但客户端应该创建它可能期间需要的所有代理感觉不对启动,然后将它们传递给客户端中的其他类使用。

是否可以仅在需要时(例如在方法中)创建集线器代理,然后在完成后将其丢弃? (我已经尝试过了,但是一旦连接开始,SignalR 将不允许您创建集线器代理)。或者创建集线器代理是否“昂贵”,因此为什么要“预先”完成?

如果我坚持以这种方式创建代理,那么将它们暴露给客户端代码的其余部分的好方法是什么?某种单例工厂?

【问题讨论】:

    标签: c# signalr signalr.client


    【解决方案1】:

    错误信息非常清楚 - 建立连接后您无法创建代理。在建立连接时,SignalR 需要知道您对哪些集线器感兴趣。来自documentation

    对于 JavaScript 客户端,您必须在调用 Start 方法建立连接之前注册至少一个事件处理程序。这对于 .NET 客户端不是必需的。对于 JavaScript 客户端,生成的代理代码会自动为服务器上存在的所有集线器创建代理,注册处理程序是您指示客户端打算使用哪些集线器的方式。但是对于 .NET 客户端,您需要手动创建 Hub 代理,因此 SignalR 假定您将使用您为其创建代理的任何 Hub。

    (我相信这基本上归结为他们如何在幕后设计他们的协议,并且基本上是当建立连接时,发送的第一个信息是关于正在使用的集线器,然后是连接只是用于传输实际的方法调用信息,但我绝不是专家)

    是否可以仅在需要时(例如在方法中)创建集线器代理,然后在完成时将其丢弃?

    除非您还想建立一个单独的HubConnection 对象,否则不会。取决于您希望每个客户端创建多少个连接。

    或者说创建一个集线器代理是“昂贵的”,因此为什么这一切都是“预先”完成的?

    代理并不昂贵,但启动 HubConnection 是。已经决定他们会让您在开始连接之前创建代理,那么显然每个您会找到的示例都会这样做。

    如果我坚持以这种方式创建代理,那么将它们暴露给客户端代码的其余部分的好方法是什么?某种单例工厂?

    无论您最喜欢什么 - 如果您愿意,可以将它们存储在静态类的静态字段中(最接近 C# 的全局变量)。对我来说,除了玩具项目之外的任何东西都倾向于总是有一个依赖注入组件,所以对我来说,我会尽早创建代理并将它们放入 DI 容器中。它们可以作为单例安全地存储在容器中,因为:

    代理对象是线程安全的。事实上,如果你用同一个 hubName 多次调用 HubConnection.CreateHubProxy,你会得到同一个缓存的 IHubProxy 对象。

    【讨论】:

    • 有用的答案,谢谢。我将使用 Castle Windsor,但没想过简单地注册集线器代理实例!
    猜你喜欢
    • 2013-10-29
    • 2019-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-08
    • 2019-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多