如何在SignalR中使用通用集线器

Tom*_*uer 9 c# asp.net signalr signalr-hub

我在版本2.1.2中使用SignalR.我注意到有两个公共中心类供我使用,Hub并且Hub<T>.前者有一个MSDN页面似乎已经过时,后者根本没有任何MSDN页面.我相信MSDN文档与Nuget的最新版本的SignalR(我正在使用)不是最新的,因为在ReSharper的帮助下反编译的源显示这两个类都继承自基HubBase类.MSDN页面的继承层次结构部分显示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) {}
}
Run Code Online (Sandbox Code Playgroud)

与非通用集线器,我刚刚打电话.Notify().Notify(new TestModel() { Name = "sth" })dynamic立法院约束this.Context.Clients.Client(…)this.Context.Caller,但与一般类,当我打电话以类似的方式,这些空的方法,浏览器不会通知.

你如何按照它应该使用的方式使用通用集线器类?

Tom*_*uer 9

我找到了答案.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);
}
Run Code Online (Sandbox Code Playgroud)

  • 请记住,为了调用`OnConnected`方法,您需要首先注册一个客户端方法:`$ .connection.testHub.client.sayHello = function(g){...}`.根据设计,不能被调用的客户端不会触发`On [Connected | Reconnected | Disconnected]方法,并且只能像请求 - 响应范例一样调用hub方法. (4认同)