簡體   English   中英

如何在SignalR中使用通用集線器

[英]How to use generic hub in SignalR

我在版本2.1.2中使用SignalR。 我注意到有兩個公共中心類供我使用, HubHub<T> 前者有一個MSDN頁面似乎已經過時,后者根本沒有任何MSDN頁面。 我相信MSDN文檔與Nuget的最新版本的SignalR(我正在使用)不是最新的,因為在ReSharper的幫助下反編譯的源顯示這兩個類都繼承自HubBase基類。 MSDN頁面的繼承層次結構部分顯示Hub類繼承自Object並實現IHubIDisposable接口,但反編譯源顯示上述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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM