我在版本2.1.2中使用SignalR。我注意到有两个公共中心课程供我使用,Hub
和Hub<T>
。前者有一个MSDN页面似乎已经过时,后者根本没有任何MSDN页面。我相信MSDN文档与Nuget的最新版本的SignalR(我正在使用)不是最新的,因为在ReSharper的帮助下反编译的源显示这两个类都继承自HubBase
基类。 MSDN页面的继承层次结构部分将Hub
类显示为继承自Object
并实现IHub
和IDisposable
接口,但反编译源显示上述HubBase
1}}基类,实现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) {}
}
使用非通用中心,我只需在.Notify()
绑定.Notify(new TestModel() { Name = "sth" })
或dynamic
上拨打this.Context.Clients.Client(…)
或this.Context.Caller
,但使用泛型类,当我以类似方式调用这些空方法时,浏览器根本不会得到通知。
如何按照它应该使用的方式使用通用集线器类?
答案 0 :(得分:10)
我找到了答案。 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);
}