2015-09-09 73 views
6

我目前使用SignalR在服務器和服務器本身產生的多個獨立進程之間進行通信。 這兩個服務器&客戶端用C#編碼。我正在使用SignalR 2.2.0.0 在服務器端,我使用OWIN來運行服務器。 我也使用LightInject作爲IoC容器。SignalR服務器 - >客戶端調用不工作

這裏是我的代碼:

public class AgentManagementStartup 
{ 
    public void ConfigurationOwin(IAppBuilder app, IAgentManagerDataStore dataStore) 
    { 
     var serializer = new JsonSerializer 
     { 
      PreserveReferencesHandling = PreserveReferencesHandling.Objects, 
      TypeNameHandling = TypeNameHandling.Auto, 
      TypeNameAssemblyFormat = FormatterAssemblyStyle.Simple 
     }; 

     var container = new ServiceContainer(); 
     container.RegisterInstance(dataStore); 
     container.RegisterInstance(serializer); 
     container.Register<EventHub>(); 
     container.Register<ManagementHub>(); 
     var config = container.EnableSignalR(); 

     app.MapSignalR("", config); 
    } 
} 

在客戶端,我註冊這樣:

public async Task Connect() 
{ 
    try 
    { 
     m_hubConnection = new HubConnection(m_serverUrl, false); 
     m_hubConnection.Closed += OnConnectionClosed; 
     m_hubConnection.TraceLevel = TraceLevels.All; 
     m_hubConnection.TraceWriter = Console.Out; 

     var serializer = m_hubConnection.JsonSerializer; 
     serializer.TypeNameHandling = TypeNameHandling.Auto; 
     serializer.PreserveReferencesHandling = PreserveReferencesHandling.Objects; 

     m_managementHubProxy = m_hubConnection.CreateHubProxy(AgentConstants.ManagementHub.Name); 
     m_managementHubProxy.On("closeRequested", CloseRequestedCallback); 

     await m_hubConnection.Start(); 
    } 
    catch (Exception e) 
    { 
     m_logger.Error("Exception encountered in Connect method", e); 
    } 
} 

在服務器端給我寄了關閉請求方式如下:

var managementHub = GlobalHost.ConnectionManager.GetHubContext<ManagementHub>(); 
managementHub.Clients.All.closeRequested(); 

我從來沒有收到CloseRequestedCallback的任何回調。無論是在客戶端還是在服務器端,我都會在日誌中看到任何錯誤。

我在這裏做錯了什麼?

編輯15年9月10日

一些研究和修改之後,我發現它與更換IoC容器的鏈接。當我刪除所有鏈接到LightInject並按原樣使用SignalR時,一切正常。自從使用SignalR LightInject documented their integration以來,我對此感到驚訝。

我發現後,我意識到GlobalHost.DependencyResolver是不一樣的,我提供給HubConfiguration。有一次,我之前

app.MapSignalR("", config); 

添加

GlobalHost.DependencyResolver = config.Resolver; 

我現在接收中CloseRequestedCallback回調。不幸的是,我只要我呼籲來自客戶端的方法到服務器收到以下錯誤:

Microsoft.AspNet.SignalR.Client.Infrastructure.SlowCallbackException

可能的死鎖檢測。用「HubProxy.On」 或「Connection.Received」註冊的回叫已執行至少10秒鐘。

我不確定我發現的修復以及它可能對系統造成的影響。可以用我自己的方式替換GlobalHost.DependencyResolver而無需註冊其所有默認內容?

EDIT 2 15年9月10日

this,改變GlobalHost.DependencyResolver是做正確的事。由於我在我所有的回調中都沒有做任何事情,所以仍然沒有解釋SlowCallbackException

+0

關於緩慢的回調,也許你需要執行緩慢的進程[在後臺](http://www.hanselman.com/blog/HowToRunBackgroundTasksInASPNET.aspx),並且只需使用SignalR來啓動任務?無論如何,這是一個單獨的問題。將您的IoC解決方案移出您的問題並作出答覆。如有必要,請爲您的慢回調創建一個新問題。 – mason

+0

@mason:在我的任何回調(客戶端和服務器端)中沒有任何長時間運行的進程。這就是爲什麼我很驚訝得到這個錯誤。我明白你的觀點,即將問題保持在同一主題內,但問題似乎相關。 – KOTIX

回答

3

問題1:IoC容器+依賴注入

如果你想改變國際奧委會你HubConfiguration,你也需要改變從GlobalHost所以請求ouside,當它返回同一個集線器的一個上下文。

問題2:意外SlowCallbackException

此異常是由事實,我是一個控制檯應用程序中使用SignalR引起的。該應用程序的入口點不能是async方法,以便能夠異步調用我的初始配置我做了如下:

private static int Main() 
{ 
    var t = InitAsync(); 
    t.Wait(); 
    return t.Result; 
} 

可惜對我來說,這會導致很多問題,如詳細描述here &更多here

通過啓動我的InitAsync如下:

private static int Main() 
{ 
    Task.Factory.StartNew(async()=> await InitAsync()); 
    m_waitInitCompletedRequest.WaitOne(TimeSpan.FromSeconds(30)); 
    return (int)EndpointErrorCode.Ended; 
} 

現在一切都運行良好,我沒有得到任何死鎖。

有關問題&答案的更多詳細信息,您也可以參考我的問題中的編輯。

相關問題