我已经设置了一个 SignalR 集线器来在服务器和客户端之间进行通信。中心服务器端代码存储在名为 Hooking.cs 的类中。我想要的是能够调用 Hooking.cs 中定义的方法,以允许我从应用程序中的任何位置向任何连接的客户端广播消息。似乎为每个客户端/服务器调用创建了一个新的 Hooking.cs 实例,因此我希望能够使用
var hooking = new Hooking();
hooking.Test();
Hooking.cs 中定义的方法 Test() 之类的东西,例如
public static void Test() {
Clients.test()
}
和客户端side javascript
var hooking = $.connection.hooking;
hooking.test = function() { alert("test worked"); };
$.connection.hub.start()
不幸的是,事情并没有那么简单,因为客户端不是静态的,因此无法通过静态方法访问。
通过查看 SignalR 源代码,我发现了一个看起来很有前途的方法,Hubs.Invoke(string hubName, string method, params object[] args)
,所以我希望我可以使用诸如 < code>Hubs.Invoke("Hooking", "Test") 但我无法使其工作。
对此的任何帮助将不胜感激
I've set up a SignalR hub to communicate between the server and client. The hub server side code is stored in a class called Hooking.cs. What I want is to be able to call a method defined in Hooking.cs to allow me to broadcast messages to any connected clients from anywhere in my application. It seems that a new instance of Hooking.cs is created for every client/server call, so I had hoped that I would be able to use something like
var hooking = new Hooking();
hooking.Test();
with the method Test() defined in Hooking.cs such as
public static void Test() {
Clients.test()
}
and with a the client side javascript
var hooking = $.connection.hooking;
hooking.test = function() { alert("test worked"); };
$.connection.hub.start()
Unfortunately it isn't that simple, as Clients is not static, so not accessible from a static method.
Looking through the SignalR source code I came across a method that looked promising, Hubs.Invoke(string hubName, string method, params object[] args)
, so I would hope I could use something such as Hubs.Invoke("Hooking", "Test")
but I can't make it work.
Any help with this would be hugely appreciated
发布评论
评论(5)
这是 SignalR 2.x 的正确方法:
基本上,您可以使用当前主机的依赖关系解析器来解析 IConnectionManager 接口,该接口允许您获取集线器的上下文对象。
更多信息可以在 中找到官方文档。
This is the correct way for SignalR 2.x:
Basically, you can use the dependency resolver for the current host to resolve the
IConnectionManager
interface which allows you to get ahold of the context object for a hub.Further information can be found in the official documentation.
Hub.GetClients 在 0.4.0 版本中已消失。
从 wiki 您现在可以使用:
Hub.GetClients has disappeared in version 0.4.0.
From the wiki you can now use:
您可以按照以下 2 个步骤轻松使用集线器 -
通过像这样的依赖注入进行实例化 -
- 2.像这样使用
hub
对象 -更多内容可以找到 此处。
可以找到示例代码在此 git 存储库中。
You can easily use a hub by following this 2 step-
Instantiating by dependency injection like this-
2.Using the
hub
object like this-More can be found here.
Example code can be found in this git repo.
看看它是如何在 https://github.com/SignalR/SignalR。
我可以在那里看到静态
Dictionary
在顶部被实例化,所以我想它们也被持久地维护,或者通过Chat
类是一个持久实例(?)或者该数组正在以某种方式更新。看看吧,大卫·福勒可能是这方面最好的。
Have a look at how it's done in
Chat.cs
inSignalR.Samples.Hubs.Chat
from https://github.com/SignalR/SignalR.I can see in there that static
Dictionary<TKey, TValue>
's are being instantiated at the top, so I imagine they are being maintained persistently too, either with theChat
class being a persisted instance (?) or that array being updated somehow.Check it out, David Fowler would probably be the best on this.
这在 .NET Core 2 中发生了变化,现在您可以像这样使用依赖注入:
This has changed in .NET Core 2, now you can use dependency injection like this: