[英]How to use generic hub in SignalR
我在版本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) {}
}
使用非通用集線器,我只是在dynamic
綁定this.Context.Clients.Client(…)
或者this.Context.Caller
上調用.Notify()
或.Notify(new TestModel() { Name = "sth" })
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);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.