如何在 SignalR 中使用通用中心
本文关键字:SignalR | 更新日期: 2023-09-27 18:27:45
我在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>
。
我希望键入我的客户端,因此当我从中心调用客户端方法时,我将获得适当的智能感知支持和强类型参数。但是,我纠结的是如何让 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" })
,但是对于泛型类,当我以类似的方式调用这些空方法时,浏览器根本不会收到通知。
如何按应有的方式使用泛型集线器类?
我已经找到了答案。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);
}