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