2012-08-29 35 views
2

我想使用SignalR將數據推送到Web客戶端。如何在SignalR中僅使用服務器功能

public class PushHub : Hub 
{ 
    public void Push(string data) 
    { 
     Clients.push(data); 
    } 
} 

public class DataGenerator 
{ 
    private readonly PushHub pushHub; 

    public void DataGenerator(PushHub pushHub) 
    { 
     this.pushHub = pushHub; 
    } 

    public void Tick() 
    { 
     pushHub.Push("Ping"); 
    } 
} 

但是,我不希望客戶端能夠調用此函數。

從服務器我只是打算調用Hub對象本身的功能(除非這是一個壞主意?)。

但我不希望客戶端能夠調用推送。

SignalR是否爲此提供了方法(例如,僅用於服務器功能的屬性)?

如果我要實現自己的東西,然後我有一些想法,但我不知道他們是多麼好:

  • 讓另一個類訪問客戶屬性,那麼它會調用推送。
  • 在HUB中存儲某種只有服務器知道的Nonce,並將該Nonce作爲額外參數傳遞給Push。
  • 檢查客戶端ID來自上下文。我想這個函數在隨機線程中調用時不存在。
+0

對不起,但我不明白,爲什麼你創建「推」方法作爲公共,如果這只是由服務器使用?只有在服務器端代碼需要時才使用此方法爲私有方法。 –

+0

它是公開的,因爲我想讓服務器上的另一個類調用它。我會更新這個問題。 –

+0

客戶是否需要爲他們提供'PushHub'?如果不是這可能不是問題。如果'PushHub'不是客戶端類,那麼阻止客戶端訪問它將解決所有問題。 – mclark1129

回答

11

繼承Hub將公開的方法暴露給客戶端。

我的猜測是,如果你想調用從服務器方法客戶端,而從輪轂繼承類,你可以通過解析並獲取樞紐對象的保持這樣做:

public class Notifier 
    { 
     public static void Say(string message) 
     { 
      var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>(); 
      context.Clients.say(message); 
     } 
    } 
} 

見SignalR維基在樞紐:https://github.com/SignalR/SignalR/wiki/Hubs

+0

謝謝,我錯過了那一點。看起來這是我想要的。我想這是我第一個選擇的方向。當我開始工作時,我會接受你的答案。 –

+1

這是正確的答案 – davidfowl

+0

它的工作,謝謝! –

相關問題