我目前使用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
。
關於緩慢的回調,也許你需要執行緩慢的進程[在後臺](http://www.hanselman.com/blog/HowToRunBackgroundTasksInASPNET.aspx),並且只需使用SignalR來啓動任務?無論如何,這是一個單獨的問題。將您的IoC解決方案移出您的問題並作出答覆。如有必要,請爲您的慢回調創建一個新問題。 – mason
@mason:在我的任何回調(客戶端和服務器端)中沒有任何長時間運行的進程。這就是爲什麼我很驚訝得到這個錯誤。我明白你的觀點,即將問題保持在同一主題內,但問題似乎相關。 – KOTIX