我开始使用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就不会让你创建一个集线器代理)。或者创建一个集线器代理是“昂贵的”,那么为什么它都是“预先”完成的呢?
如果我坚持以这种方式创建代理,那么将它们暴露给其余客户端代码的好方法是什么?某种单身工厂?
答案 0 :(得分:6)
错误消息非常清楚 - 建立连接后无法创建代理。在建立连接时,SignalR需要知道您感兴趣的哪个中心。来自documentation:
对于JavaScript客户端,在调用Start方法建立连接之前,必须至少注册一个事件处理程序。这不是.NET客户端所必需的。对于JavaScript客户端,生成的代理代码会自动为服务器上存在的所有集线器创建代理,并且注册处理程序是指示客户端打算使用哪些集线器的方式。但是对于.NET客户端,您可以手动创建Hub代理,因此SignalR假定您将使用您为其创建代理的任何Hub。
(我认为这基本上归结为他们如何在幕后设计他们的协议,并且基本上当建立连接时,发送的第一个信息是关于正在使用哪些集线器,之后连接只用于传输实际的方法调用信息,但我绝不是专家)
是否可以仅在需要时(例如在方法中)创建集线器代理,然后在完成后处理它?</ p>
除非您想要建立单独的HubConnection
对象,否则不会。取决于您希望每个客户创建多少个连接。
或者创建一个集线器代理是“昂贵的”,那么为什么它都是“预先”完成的呢?
代理并不昂贵,但启动HubConnection
是。决定在开始连接之前他们会让你创建代理,然后很明显你会发现的每个例子。
如果我坚持以这种方式创建代理,那么将它们暴露给其余客户端代码的好方法是什么?某种单身工厂?
无论你最喜欢什么 - 如果你愿意,你可以将它们存储在静态类中的静态字段中(最接近的C#来自全局变量)。对我来说,玩具项目以外的任何东西往往都有一个依赖注入组件,所以对我来说,我会尽早创建代理并将它们放入DI容器中。从以下情况开始,它们可以安全地作为单例存储在容器中:
代理对象是线程安全的。实际上,如果使用相同的hubName多次调用
HubConnection.CreateHubProxy
,则会获得相同的缓存IHubProxy
对象。