Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在信号机中使用通用集线器_C#_Asp.net_Signalr_Signalr Hub - Fatal编程技术网

C# 如何在信号机中使用通用集线器

C# 如何在信号机中使用通用集线器,c#,asp.net,signalr,signalr-hub,C#,Asp.net,Signalr,Signalr Hub,我在版本2.1.2中使用信号器。我注意到有两个公共集线器类供我使用,hub。前者有一个MSDN页面,看起来已经过时,而后者根本没有任何MSDN页面。我相信MSDN文档与Nuget(我正在使用)的最新版本的SignalR不是最新的,因为在ReSharper帮助下反编译的源代码显示这两个类都继承自HubBase基类。MSDN页面的继承层次结构部分将Hub类显示为继承自Object并实现IHub和IDisposable接口,但是反编译的源代码显示了上述HubBase基类,实现IHub接口,该接口反过来

我在版本2.1.2中使用信号器。我注意到有两个公共集线器类供我使用,
hub
。前者有一个MSDN页面,看起来已经过时,而后者根本没有任何MSDN页面。我相信MSDN文档与Nuget(我正在使用)的最新版本的SignalR不是最新的,因为在ReSharper帮助下反编译的源代码显示这两个类都继承自
HubBase
基类。MSDN页面的继承层次结构部分将
Hub
类显示为继承自
Object
并实现
IHub
IDisposable
接口,但是反编译的源代码显示了上述
HubBase
基类,实现
IHub
接口,该接口反过来实现
IDisposable

类的非泛型变量和泛型变量之间的区别在于,非泛型变量的
客户端
属性返回
IHubCallerConnectionContext
,而泛型变量返回键入的
IHubCallerConnectionContext

我想让我的客户机类型化,所以当我从中心调用客户机方法时,我会有适当的Intellisense支持和强类型参数。然而,我所面临的困难是如何让中心知道我的客户机模型的方法实际上是在浏览器中调用的

这是我的
TestModel
课程:

public sealed class TestModel
{
   public String Name { get; set; }
   public void Notify() {}
   public void NotifyComplex(TestModel model) {}
}
使用非泛型hub,我只需在
动态
绑定
this.Context.Clients.Client(…)
this.Context.Caller
上调用
.Notify()
.Notify(new TestModel(){Name=“sth”})
,浏览器根本不会收到通知


如何按预期的方式使用泛型hub类?

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

正如本文中的示例所示,如果使用类型参数的接口,一切都会正常工作,并且会得到强类型集线器客户机,这些客户机的方法会正确转换为s。下面是我测试的一段代码:

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);
}
公共密封类TestHub
:轮毂
{
已连接的公用覆盖任务()
{
this.Clients.Caller.SayHello(“来自OnConnect的你好!”);
返回base.OnConnected();
}
公共图书馆
{
//当客户机向服务器打招呼时,向客户机回招呼。
这个。客户。来电者。说你好(“哦,你好!”;
}
}
公共接口ITestClient
{
void SayHello(字符串问候语);
}

这可能有用:恐怕这个问题与此无关。我感兴趣的是从服务器调用客户机方法,而不是相反,这就是问题的OP所做的,我想使用RPC调用的方法不是泛型的,但是hub是,它的客户机也是。不过,我很感谢你的评论。我不确定这是否有用,但我想我会提供我的发现。抱歉,我没有任何其他有用的见解:(别着急,最终会找到答案的。)请记住,为了调用
OnConnected
方法,您需要首先注册一个客户端方法:
$.connection.testHub.client.sayHello=function(g){…}
。根据设计,无法调用的客户机不会触发[Connected | Reconnected | Disconnected]
方法上的
,只能调用与请求-响应范式类似的hub方法。