首页 文章

在.Net客户端中创建多个Signalr集线器代理

提问于
浏览
4

我开始使用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就不会让你创建一个集线器代理) . 或者创建一个集线器代理是“昂贵的”,那么为什么所有这些都是“预先”完成的?

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

1 回答

  • 6

    错误信息非常清楚 - 你可以't create proxies after the connection is established. At the time that the connection is established, SignalR needs to know which hubs you'对此感兴趣 . 来自documentation

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

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

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

    除非你想要 Build 一个单独的 HubConnection 对象 . 取决于您希望每个客户端创建多少个连接 .

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

    代理并不昂贵,但启动 HubConnection 是 . 决定在开始连接之前他们会让你创建代理,那么显然你会发现每个例子都是如此 .

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

    无论你最喜欢什么 - 如果你愿意,你可以将它们存储在静态类中的静态字段中(最接近的C#来自全局变量) . 对我来说,玩具项目以外的任何东西往往都有一个依赖注入组件,所以对我来说,我会尽早创建代理并将它们放入DI容器中 . 从以下情况开始,它们可以安全地作为单件存储在容器中:

    代理对象是线程安全的 . 实际上,如果使用相同的hubName多次调用HubConnection.CreateHubProxy,则会获得相同的缓存IHubProxy对象 .

相关问题