【发布时间】:2023-03-23 04:38:01
【问题描述】:
我在 2.1.2 版中使用 SignalR。我注意到有两个公共集线器类供我使用,Hub 和 Hub<T>。前者有一个似乎已经过时的 MSDN 页面,而后者根本没有任何 MSDN 页面。我相信 MSDN 文档不是最新版本的来自 Nuget(我正在使用)的 SignalR,因为在 ReSharper 的帮助下反编译的源显示这两个类都继承自 HubBase 基类。 MSDN 页面的 Inheritance Hierarchy 部分显示Hub 类继承自Object 并实现IHub 和IDisposable 接口,但是反编译的源代码显示上述HubBase 基类,实现IHub 接口,其中转实现IDisposable。
类的非泛型和泛型变体之间的区别在于,非泛型的Clients 属性返回IHubCallerConnectionContext<dynamic>,而泛型变体返回类型为IHubCallerConnectionContext<T>。
我想让我的客户端键入,所以当我从集线器调用客户端方法时,我将获得适当的 Intellisense 支持和强类型参数。不过,我纠结的是如何让 Hub 知道我的客户端模型的方法实际上是要在浏览器中调用的。
这是我的TestModel 班级:
public sealed class TestModel
{
public String Name { get; set; }
public void Notify() {}
public void NotifyComplex(TestModel model) {}
}
使用非泛型集线器,我只需调用dynamicly 绑定的this.Context.Clients.Client(…) 或this.Context.Caller 上的.Notify() 或.Notify(new TestModel() { Name = "sth" }),但使用泛型类,当我调用这些空方法时类似的方式,浏览器根本不会收到通知。
您如何以应有的方式使用通用集线器类?
【问题讨论】:
-
恐怕这个问题是无关的。我有兴趣从服务器调用客户端方法,而不是相反,这就是那个问题的 OP 正在做的事情,我想使用 RPC 调用的方法不是通用的,但是集线器是,它的也是客户。不过,我很欣赏你的评论。
-
我不确定它是否有用,但我想我会提供我发现的。抱歉,我没有任何其他有用的见解:(
-
别着急,答案总会找到的。 :)
标签: c# asp.net signalr signalr-hub