2012-10-03 169 views
2

我對SignalR絕對陌生,所以請原諒我的問題。我有很多在AWS EC2實例上運行的控制檯應用程序(或Windows服務), 我有一個Web服務器(IIS託管MVC3),當然我擁有無限數量的Web客戶端。SignalR和異類客戶端

我該如何溝通?比方說,

  1. 我需要每隔幾秒鐘獲得在網絡瀏覽器從EC2機的一些信息 - (CPU負載或類似的東西)
  2. 按需 (當用戶點擊網頁上的按鈕)它應該拉動東西 其他(假設C:驅動器上的AvailibleDiskSpace)

我應該使用什麼 - Hub或PersistentConnection?在這種情況下控制檯應用程序也將是客戶端或SelfHosts(什麼是SelfHost呢?)

是否有任何示例代碼,我可以學習如何構建這樣的東西? (我相信Nuget,Github和VideoTutorials上的示例向您展示瞭如何構建單服務器/多Web客戶端解決方案,但不是我需要的東西)

回答

1

您將需要使用Hub。

下面是如何做到這一點(在0.5.3)的例子:

服務器端(中心):

public class MyDashboard : Hub 
{ 
    /* Have this method called every few seconds via a timer */ 
    public void SendLoad() 
    { 
     // Will call the "retrieveLoad" JS method on the clients 
     Clients.retrieveLoad(new { 
      CPU = 10.25, // Put something relevant here 
      Memory = "80%" // Again, put something relevant here 
     }); 
    } 

    public double GetDiskSpace() 
    { 
     return 3829847; // You'd replace the number with something more relevant 
    } 
} 

客戶端(JavaScript的):

var dashboard = $.connection.myDashboard; 

dashboard.retrieveLoad = function(info) { 
    console.log("The CPU is at: " + info.CPU); 
    console.log("The Memory is at: " + info.Memory); 
} 

$.connection.hub.start(function() { 
    // This is called once the hub has started, so we need to wire up our click event 
    $("#myButton").click(function() { 
     dashboard.getDiskSpace(function(space) { 
      console.log("The disk space is at: " + space); 
     }); 
    }); 
}); 

希望這有助於!請隨時停止通過我們的JabbR室與其他人討論框架:http://jabbr.net/#/rooms/signalr

注意:請記住,如果您想要在您的中心(私有/公共變量等)上保留任何內容以使數據保持靜態。

+0

不,我的意思是我應該把Hub放在哪裏?在MVC應用上,對嗎?那麼EC2機器上的應用程序如何通過Web服務器將其東西發送到Web客戶端? – Agzam

+0

EC2機器通過名爲SignalR.Client的.NET庫以常規客戶機的身份連接到您的MVC應用程序中的SignalR服務器。然後,您可以讓客戶端在服務器上調用集線器方法,然後向連接的客戶端廣播(無論它們是JS還是.NET並不重要)。 –

1

很多的一個問題... :)

首先,控制檯應用程序/ Windows服務可能只是客戶端一樣的瀏覽器將是相同的Hub。根本沒有理由爲此編程模型下降到PersistentConnection

其次,你討論兩個differenct用例:

  1. 如果您需要推動的每隔幾秒鐘的東西的狀態,這是完美的SignalR客戶端的方法。您只需根據您可能從性能計數器收到的任何通知在客戶端上調用該方法即可。這種邏輯既可以在Hub中,也可以僅僅由Hub的客戶端調用一種方法,然後將該方法「分散」給集線器的所有其他客戶端(建議後者)。
  2. 對於按鈕按下/獲取ServerA方案上的可用空間,您正在討論幾個圖層。無論如何,您需要從瀏覽器獲得一條消息到ServerA以獲得您要查找的結果,然後回覆瀏覽器。老實說,這並不是純粹由SignalR解決的。ServerA需要有一個自己的服務接口,Hub可以調用以獲得結果並能夠響應瀏覽器客戶端。然後,您將瀏覽器調用中心方法,中心方法將向ServerA發出請求,等待結果,然後將結果返回給瀏覽器。這裏有很多路由工作要做,但沒有什麼神奇的,沒有什麼特別的SignalR。對於所有意圖和目的而言,此方案可以在純Web服務體系結構中完成。

接下來,Self-Host意味着在IIS + ASP.NET以外的主機中承載SignalR服務器。例如,您可以在另一個控制檯應用程序或Windows服務中啓動SignalR服務,而不是在IIS + ASP.NET中託管。你可以找到自我託管的體面文件here in the SignalR Wiki

至於SignalR樣,說實話沒有什麼是你在想什麼建築比基本文件不同的節目,你怎麼辦。您需要look at the .NET client hub wiki page用於您的控制檯應用程序/ Windows服務,您需要爲您的瀏覽器應用程序提供look at the browser client wiki page,然後您需要look at the self hosting wiki page,以便在IIS + ASP.NET之外託管您的服務器。

2

你最好的選擇很可能在IIS上與你的MVC應用程序一起舉辦SignalR服務器。因爲您已經設置了IIS,所以不要擔心自行託管。

我想你會使用集線器超過PersistentConnections由於集線器允許RPC更容易的時間。

在您的控制檯應用程序和窗口服務,我會建議使用SignalR .NET客戶端。

https://github.com/SignalR/SignalR/wiki/SignalR-Client-Hubs

您可以推,從控制檯應用程序來,然後可以反過來又可以作爲代理到瀏覽器客戶端行事SignalR服務器獲取數據。當然,SignalR服務器可以雙向代理,允許任何客戶端向其他客戶端發送實時消息或請求。

https://github.com/SignalR/SignalR/wiki/SignalR-JS-Client-Hubs

你的.NET和JS客戶端可以訪問相同的集線器或不同集線器。如果所有客戶端都訪問同一個集線器,則可能需要將它們分成組,以便您可以區分這兩種類型的客戶端。如果您選擇使用多個集線器,則您可能希望利用GlobalHost.ConnectionManager.GetHubContext<MyHub>()與連接到與被調用集線器不同的集線器的客戶端進行通信。