【问题标题】:How to use generic hub in SignalR如何在 SignalR 中使用通用集线器
【发布时间】:2023-03-23 04:38:01
【问题描述】:

我在 2.1.2 版中使用 SignalR。我注意到有两个公共集线器类供我使用,HubHub<T>。前者有一个似乎已经过时的 MSDN 页面,而后者根本没有任何 MSDN 页面。我相信 MSDN 文档不是最新版本的来自 Nuget(我正在使用)的 SignalR,因为在 ReSharper 的帮助下反编译的源显示这两个类都继承自 HubBase 基类。 MSDN 页面的 Inheritance Hierarchy 部分显示Hub 类继承自Object 并实现IHubIDisposable 接口,但是反编译的源代码显示上述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


【解决方案1】:

我找到了答案。 MSDN 文档目前还不是最新的,但 ASP .NET 站点提供了不错的 SignalR 教程,其中之一涵盖了类型化集线器:

http://www.asp.net/signalr/overview/guide-to-the-api/hubs-api-guide-server#stronglytypedhubs

如文章中的示例所示,如果您使用接口作为类型参数,一切正常,您将获得强类型集线器客户端,其方法被正确转换为RPCs。这是我测试过的一段代码:

public sealed class TestHub
  : Hub<ITestClient>
{
  public override Task OnConnected()
  {
    this.Clients.Caller.SayHello("Hello from OnConnected!");
    return base.OnConnected();
  }

  public void Hi()
  {
    // Say hello back to the client when client greets the server.
    this.Clients.Caller.SayHello("Well, hello there!");
  }
}

public interface ITestClient
{
  void SayHello(String greeting);
}

【讨论】:

  • 请记住,为了调用OnConnected 方法,您需要先注册一个客户端方法:$.connection.testHub.client.sayHello = function(g) { … }。按照设计,无法调用的客户端不会触发On[Connected|Reconnected|Disconnected] 方法,只能调用中心方法,类似于请求-响应范例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-09
  • 1970-01-01
  • 2022-09-28
相关资源
最近更新 更多