2013-11-22 29 views
10

發送數據我有這樣一箇中心:SignalR:使用GlobalHost.ConnectionManager不工作

public class MessageHubBub : Hub 
{ 

    public void ServerMethod() 
    { 
     Clients.All.sayHi("hello"); 
     GlobalHost.ConnectionManager.GetHubContext<MessageHubBub>().Clients.All.sayHi("Hello"); 
    } 
} 

我(relavent)的JavaScript看起來像這樣:

$.connection.MessageHubBub.client.sayHi = function (message) { 
       console.log("Hello"); 
      }; 

      $.connection.hub.start().done(function() { 
       $.connection.MessageHubBub.server.ServerMethod(); 
      }); 

真正奇怪的是,「你好「只打印一次,在那裏我會預料它會被打印兩次(因爲'sayHello'被稱爲兩次)。一般來說,我一直在使用從GlobalHost.ConnectionMananager獲得的'clients'對象向客戶端發送消息時遇到麻煩,所以我將這個問題提煉出來以顯示哪些不起作用。

我看過很多帖子,有人在開始集線器或沒有引入正確的js依賴關係時沒有註冊他們的js處理程序,但這些似乎不是我的問題。有什麼理由不能使用GlobalHost.ConnectionManager.GetHubContext()發送消息給客戶端。客戶端?

編輯: 作爲對Lars的迴應,我確實有一個自定義的依賴關係解析器,以便我可以將Unity集成到SignalR中。我跟着一個例子,我在這裏找到:http://www.kevgriffin.com/using-unity-for-dependency-injection-with-signalr/

配置的唯一行我有如下:

RouteTable.Routes.MapHubs(new HubConfiguration() { Resolver = new SignalRUnityDependencyResolver(unityContainer) }); 

的SignalRUnityDependencyResolver看起來是這樣的:

public class SignalRUnityDependencyResolver : DefaultDependencyResolver 
    { 
     private IUnityContainer _container; 

     public SignalRUnityDependencyResolver(IUnityContainer container) 
     { 
      _container = container; 
     } 

     public override object GetService(Type serviceType) 
     { 
      if (_container.IsRegistered(serviceType)) return _container.Resolve(serviceType); 
      else return base.GetService(serviceType); 
     } 

     public override IEnumerable<object> GetServices(Type serviceType) 
     { 
      if (_container.IsRegistered(serviceType)) return _container.ResolveAll(serviceType); 
      else return base.GetServices(serviceType); 
     } 

    } 
+0

您是否使用了自定義的依賴解析器?你的SignalR配置代碼是什麼樣的? –

+0

我編輯了答案以提供一些額外的細節。 – Kyle

+0

[SignalR +通過操作方法將消息發佈到集線器]的可能重複(http://stackoverflow.com/questions/7549179/signalr-posting-a-message-to-a-hub-via-an-action -method) – Liam

回答

24

在使用自定義依賴解析器,將它傳遞給HubConfiguration還不夠。

您需要可以存儲一些解析器實例,並使用它像這樣來訪問連接管理器和集線器背景:

MyDependencyResolver.Resolve<IConnectionManager>().GetHubContext<MyHub>(); 

或GlobalHost默認依賴解析器設置到您的實例:

var myResolver = new SignalRUnityDependencyResolver(unityContainer); 
RouteTable.Routes.MapHubs(new HubConfiguration() { Resolver = myResolver }); 
GlobalHost.DependencyResolver = myResolver; 

(那麼你可以使用默認的GlobalHost.ConnectionManager.GetHubContext<MessageHubBub>()

+2

你是一個救星! – Raghav

+1

那花了我很長時間才發現。您的解決方案完美運作謝謝。 –