2013-06-30 3 views
29

Как я могу назвать метод хаба из-за действия контроллера? Каков правильный способ сделать это?Вызвать метод хаба из-за действия контроллера

Кто-то использовал это в пост:

DefaultHubManager hd = new DefaultHubManager(GlobalHost.DependencyResolver); 
var hub = hd.ResolveHub("AdminHub") as AdminHub; 
hub.SendMessage("woohoo"); 

Но для меня, что бросает:

Использование экземпляра Hub не создается HubPipeline не поддерживается.

Я читал также, что вы можете создать контекст ступицу, но я не хочу, чтобы дать ResponsAbility к действию, то есть действие, делая такие вещи, как:

hubContext.Client(...).someJsMethod(..) 
+0

возможно дубликат [SignalR + разместив сообщение на концентратор с помощью метода действия] (http://stackoverflow.com/questions/7549179/signalr-posting-a-message-to-a -hub-through-an-action-method) –

ответ

83

правильным способом является создание контекста концентратора. Как и где вы делаете это до вас, вот два approachs:

  1. Создать статический метод в ступице (не должен быть в концентраторе, может быть на самом деле в любом месте), а затем вы можете просто назвать его через AdminHub.SendMessage("wooo")

    public static void SendMessage(string msg) 
    { 
        var hubContext = GlobalHost.ConnectionManager.GetHubContext<AdminHub>(); 
        hubContext.Clients.All.foo(msg); 
    } 
    
  2. Избегайте статический метод все вместе и просто послать непосредственно клиент концентраторов

    var hubContext = GlobalHost.ConnectionManager.GetHubContext<AdminHub>(); 
        hubContext.Clients.All.foo(msg); 
    
+1

Хорошо, если это правильный путь, это так. Благодаря! – sports

+1

как насчет того, что я вызову вызывающего абонента в этом случае ?? мы не можем позвонить Клиентам. Какую в этой части правильно? как будет подход для этого? –

+2

Нет, вы не можете этого сделать. Вам нужно будет отследить ваших пользователей ConnectionIds, а затем вы можете сделать «hubContext.Client (theusersconnectionid) .foo (msg) –