2016-08-08 108 views
0

以下情形:我有一個運行SignalR集線器的ASP.NET Web Api,爲SPA提供服務。 SignalR集線器用於與多個C#SignalR客戶端進行通信。 現在我想從特定的客戶端檢索數據,並將這些數據從Web API控制器返回給Web客戶端。請參閱下面的示例:從Web API控制器呼叫SignalR客戶端

public async Task<IHttpActionResult> Get() 
    { 
     Microsoft.AspNet.SignalR.GlobalHost.ConnectionManager.GetHubContext<Hubs.ConfigHub>().Clients.Client("SomeConnectionId").getData(); 
     // SignalR client is calling a callback method on the SignalR hub hosted in the web api 
     // return data; 
    } 

有什麼辦法可以實現這個目標嗎?

+0

什麼實際問題?代碼(無論如何,它的抽象)對我來說看起來不錯 –

+0

問題是我需要客戶端在我從web api控制器返回數據之前返回數據。 –

回答

1

can't從服務器集線器檢索客戶端數據。這是SignalR缺失的功能。

服務器只能調用客戶端的命令,但不能等待任何響應,所以Clients.Client("SomeConnectionId").getData()永遠不會返回任何東西。只有客戶能夠做到這一點。

有沒有簡單的方法來做到這一點。這是我會做什麼,以解決情況:

public async Task<IHttpActionResult> Get() 
{ 
    Microsoft.AspNet.SignalR.GlobalHost.ConnectionManager 
     .GetHubContext<Hubs.ConfigHub>() 
     .Clients.Client("SomeConnectionId") 
     .PleaseSendYourDataToTheHub(); 

    // don´t return anything and don´t await for results on the web client. 
    // The client just needs a 200 (ok) response to be sure the request 
    // is sent and going on. 
} 

客戶端將「聽」該命令(PleaseSendYourDataToTheHub),然後調用輪轂的相應方法。

在集線器你會喜歡的方法:

public void OnClientData(DataType data) 
{ 
    // TODO find out the web client connection id 
    // send the data to the web client 
    Clients.Client("webClientConnectionId") 
     .DataFromClient(clientId, data); 
} 

然後,在Web客戶端,你會聽像一個代理事件:

proxy.on('DataFromClient', function(clientId, data) { 
    // do something with the data 
}); 
+0

感謝您的幫助! –