2012-07-13 95 views
6

這與SignalR + posting a message to a Hub via an action method,但我的問題是有點不同:從服務器發送signalr消息向所有客戶

我在signalr的0.5.2版本,使用集線器。在舊版本中,你被鼓勵創造的樞紐將消息發送到所有客戶端,方法這是我有:

public class MyHub : Hub 
{ 
    public void SendMessage(string message) 
    { 
     // Any other logic here 
     Clients.messageRecieved(message); 
    } 

    ... 
} 

所以在0.5.2,我想將消息發送給所有的客戶端(從控制器的某個地方說)。我怎樣才能訪問MyHub實例?

我見過引用的唯一方法是:

var hubContext = GlobalHost.ConnectionManager.GetHubContext<MyHub>(); 
hubContext.Clients.messageRecieved("hello"); 

這很好,但我想調用的方法在我的樞紐。

+0

這現在也可以在ASP.NET Core中使用(儘管SignalR本身在當前時間仍然是alpha)。請參閱此問題的核心版本[詳細解答](http://stackoverflow.com/a/38832879/957950)。 – brichins 2017-03-08 22:51:04

回答

18

您可以通過使用一個靜態方法做到這一點:

SignalR v.04-

public class MyHub : Hub 
{ 
    internal static void SendMessage(string message) 
    { 
     var connectionManager = (IConnectionManager)AspNetHost.DependencyResolver.GetService(typeof(IConnectionManager)); 
     dynamic allClients = connectionManager.GetClients<MyHub>(); 
     allClients.messageRecieved(message); 
    } 

    ... 
} 

SignalR 0.5+

public class MyHub : Hub 
{ 
    internal static void SendMessage(string message) 
    { 
     IHubContext context = GlobalHost.ConnectionManager.GetHubContext<MyHub>(); 
     context.Clients.messageRecieved(message); 
    } 

    ... 
} 

然後,您可以調用這個像這樣:

MyHub.SendMessage("The Message!"); 

Good articl E在SignalR API:http://weblogs.asp.net/davidfowler/archive/2012/05/04/api-improvements-made-in-signalr-0-5.aspx

由保羅·莫雷蒂在給予

+1

'AspNetHost.DependencyResolver'已在SignalR 0.5+中消失。見[這裏](http://weblogs.asp.net/davidfowler/archive/2012/05/04/api-improvements-made-in-signalr-0-5.aspx)(獲取對連接/集線器的引用在連接或集線器之外) – 2012-07-13 16:27:38

+0

@PaoloMoretti - 感謝您的提示! – Paul 2012-07-13 18:04:01

+0

乾杯,這是訣竅! – 2012-07-13 22:08:50

4

我有同樣的問題,在我的例子addNotification是客戶端的方法:

var hubContext = GlobalHost.ConnectionManager.GetHubContext<SignalR.NotificationsHub>(); 
hubContext.Clients.addNotification("Text here"); 

在你客戶端你可以添加代碼呼叫中心法addNotification:

var notification = $.connection.notificationHub; 
notification.addNotification = function (message) { 
notification.addServerNotification(message); // Server Side method 
} 

$.connection.hub.start(); 

樞紐:

[HubName("notificationHub")] 
    public class NotificationsHub : Hub 
    { 
     public void addServerNotification(string message) 
     { 
      //do your thing 
     } 
    } 

更新: 一遍又一遍地讀你的問題我真的沒有找到一個理由這樣做。 Hub方法通常在客戶端被調用,或者我誤解了你,無論如何這裏是一個更新。如果你想做一個服務器端的事情,然後通知客戶。

[HttpPost] 
    [Authorize] 
    public ActionResult Add(Item item) 
    { 
     MyHubMethodCopy(item); 
     var hubContext = GlobalHost.ConnectionManager.GetHubContext<SignalR.NotificationsHub>(); 
    hubContext.Clients.addNotification("Items were added"); 

    } 

    private void MyHubMethodCopy(Item item) 
    { 
     itemService.AddItem(item); 
    } 
+0

其他答案回答我的問題,但你得到一個+1,因爲反思,我不知道我需要調用一個集線器方法 - 就像你說的'集線器方法有客戶端' – 2012-07-13 22:07:31

+0

+1用於指出如何使用中心方法。我會做同樣的錯誤。在此之後修復它。 – 2013-01-10 10:43:34

+0

@emrenevayeshirazi有什麼錯誤? – sotn 2017-01-15 17:28:29

相關問題