如何在 SignalR 中使用通用中心

本文关键字:SignalR | 更新日期: 2023-09-27 18:27:45

我在2.1.2版本中使用SignalR。我注意到有两个公共中心类供我使用,HubHub<T> 。前者有一个似乎过时的MSDN页面,后者根本没有任何MSDN页面。我相信 MSDN 文档不是最新的 Nuget(我正在使用的(最新版本的 SignalR,因为在 ReSharper 的帮助下反编译的源代码显示这两个类都继承自HubBase基类。MSDN 页面的"继承层次结构"部分将 Hub 类显示为从Object继承并实现IHubIDisposable接口,但是反编译源揭示了上述HubBase基类,实现了IHub接口,而接口又实现了IDisposable

类的非泛型变体

和泛型变体之间的区别在于,非泛型的 Clients 属性返回IHubCallerConnectionContext<dynamic>,而泛型变体返回类型化IHubCallerConnectionContext<T>

我希望键入我的客户端,因此当我从中心调用客户端方法时,我将获得适当的智能感知支持和强类型参数。但是,我纠结的是如何让 Hub 知道我的客户端模型的方法实际上是要在浏览器中调用的。

这是我TestModel课:

public sealed class TestModel
{
   public String Name { get; set; }
   public void Notify() {}
   public void NotifyComplex(TestModel model) {}
}

使用非泛型集线器,我只需在绑定dynamic this.Context.Clients.Client(…)this.Context.Caller上调用.Notify().Notify(new TestModel() { Name = "sth" }),但是对于泛型类,当我以类似的方式调用这些空方法时,浏览器根本不会收到通知。

如何按应有的方式使用泛型集线器类?

如何在 SignalR 中使用通用中心

我已经找到了答案。MSDN 文档尚未更新,但 ASP .NET 站点提供了很好的 SignalR 教程,其中一个教程涵盖了类型化中心:

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

如本文中的示例所示,如果对类型参数使用接口,则一切正常,并且会获得强类型中心客户端,其方法已正确转换为 RPC。这是我测试过的一段代码:

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);
}