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并实现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) {}
}
Run Code Online (Sandbox Code Playgroud)
与非通用集线器,我刚刚打电话.Notify()或.Notify(new TestModel() { Name = "sth" })在dynamic立法院约束this.Context.Clients.Client(…)或this.Context.Caller,但与一般类,当我打电话以类似的方式,这些空的方法,浏览器不会通知.
你如何按照它应该使用的方式使用通用集线器类?
我找到了答案.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)