2017-02-01 159 views
1

我擔心如何在以下情況下使用SgnalR:呼叫客戶端方法SignalR項目

有一個非集線器服務項目定期運行耗時的任務。 應該通知客戶端正在運行的任務的進度。經過一番研究,SignalR似乎是這個目的的正確選擇。

問題是,我希望Service-Hub-Clients系統儘可能鬆散耦合。所以,我主持了中心在IIS作爲一個SignalR文檔建議,加入到外項目集線器上下文的引用,並呼籲在客戶端的方法:

hubContext = GlobalHost.ConnectionManager.GetHubContext<TheHub>() 
    hubContext.Clients.All.progress(n, i); 

客戶端:

private void InitHub() 
    { 
     hubConnection = new HubConnection(ConfigurationManager.AppSettings["hubConnection"]); 

     hubProxy = hubConnection.CreateHubProxy("TheHub"); 
     hubConnection.Start().Wait(); 
    } 

    hubProxy.On<int, int>("progress", (total, done) => 
     { 
      task1Bar.Invoke(t => t.Maximum = total); 
      task1Bar.Invoke(t => t.Value = done); 
     }); 

在客戶端方法沒有被調用,經過兩天的研究,我無法得到它的工作,儘管當從Hub本身打電話時,它工作正常。我懷疑我缺少一些配置

+0

你能告訴我們你是如何創建'HubConnection'更多的代碼和'IHubProxy' –

+0

嗨,邁克爾。我在 – GAG

+0

上面添加了代碼好的,通常這應該起作用。檢查'n'和'i'是否都是'int'類型。此外,在'TheHub'中重載'Task OnConnected'方法,並且在'hubConnection.Start()'制動點被擊中後添加一個斷點來檢查。 –

回答

2

如果調用者將是除Web項目之外的任何項目,則不能在Hub類或服務中使用GlobalHost.Connection管理器。

GlobalHost.ConnectionManager.GetHubContext<TheHub>() 

而是應該創建一個服務類,將抽象的從呼叫者的樞紐。服務類應該是這樣:

// This method is what the caller sees, and abstracts the communication with the Hub 
public void NotifyGroup(string groupName, string message) 
{ 
    Execute("NotifyGroup", groupName, message); 
} 

// This is the method that calls the Hub 
private void Execute(string methodName, params object[] parameters) 
{ 
    using (var connection = new HubConnection("http://localhost/")) 
    { 
    _myHub = connection.CreateHubProxy("TheHub"); 
    connection.Start().Wait(); 
    _myHub.Invoke(methodName, parameters); 
    connection.Stop(); 
    } 
} 

的最後一位是集線器本身,應該是這樣的:

public void NotifyGroup(string groupName, string message) 
{ 
    var group = Clients.Group(groupName); 
    if (group == null) 
    { 
    Log.IfWarn(() => $"Group '{groupName}' is not registered"); 
    return; 
    } 
    group.NotifyGroup(message); 
}