SignalR冻结在'启动启动请求'

时间:2017-04-11 21:06:49

标签: javascript asp.net signalr

我遇到了SignalR最奇怪的行为。经过一些重构后,我遇到了连接问题。我认为这是纯粹的运气,因为代码不符合推荐的做法。例如,在我声明集线器方法(由David Fowler解释)之前,我启动了集线器,因此客户端从未明确订阅过这些集线器,但不知何故他们这样做了。我看了一整天为什么以及如何但没有运气。

重构后,这是加载文档后执行的代码:

function initSignalR() {
   var me = this,
    appointmentHub = $.connection.appointmentHub,
    assignmentHub = $.connection.assignmentHub,
    taskHub = $.connection.taskHub,      
    notificationHub = $.connection.notificationHub,
    messageHub = $.connection.messageHub;

  $.connection.hub.connectionSlow(onConnectionSlow);
  $.connection.hub.stateChanged(onStateChanged);
  $.connection.hub.error(onError);
  $.connection.hub.disconnected(onDisconnected);
  $.connection.hub.logging = true;

  appointmentHub.client.updateAppointment = onUpdateAppointment;    
  $.connection.hub.start().done(onDone).fail(onFailed);
   ... code ommitted for brevity ...
}

function onUpdatedAppointment(appointment) {
 .... code ommitted for brevity ....
}

这些是偶尔出现在控制台中的日志:

Client subscribed to hub 'appointmenthub' Negotiating with '/signalr/negotiate?clientProtocol=1.5&connectionData=%5B%7B%22name%22%3A%22appointmenthub%22%7D%5D' webSockets transport starting. Connecting to websocket endpoint 'ws://localhost:52541/signalr/connect?.... Websocket opened. webSockets transport connected. Initiating start request. The start request succeeded. Transitioning to the connected state. Now monitoring keep alive with a warning timeout of 13333.333333333332, keep alive timeout of 20000 and disconnecting timeout of 30000

我偶尔写过'故意,因为SignalR偶尔连接正确。可悲的是,大部分时间我都没有达到那么远。通常,控制台中最后一个可见步骤是:

  

webSockets传输已连接。启动启动请求。

有一段时间以来,我认为这是回调方法的主体导致了我可以连接的问题,当我有一个空函数时,但即使这不是原因。因此,我想知道下一步该做什么。

为了完整起见,这是ASP.NET MVC中的启动代码:

GlobalHost.Configuration.TransportConnectTimeout = TimeSpan.FromSeconds(50);
GlobalHost.Configuration.ConnectionTimeout = TimeSpan.FromSeconds(110);

GlobalHost.HubPipeline.AddModule(new ErrorHandlingPipelineModule());    
GlobalHost.DependencyResolver.Register(typeof(IJavaScriptMinifier), () => new SignalRMinifier());
GlobalHost.DependencyResolver.Register(typeof(IUserIdProvider), () => new UserIdProvider());

HubConfiguration hubConfiguration = new HubConfiguration()
{                 
   EnableDetailedErrors = true,  
};

return app.MapSignalR(hubConfiguration);

我找到了similar issue,但没有提供任何解决方案。

我在IE / Edge / Chrome / Firefox / Opera中对此进行了测试,结果都相同。该应用程序在ASP.NET MVC5上运行,并使用最新版本的SignalR(2.2.1)。

1 个答案:

答案 0 :(得分:1)

事实证明,客户端代码或SignalR的配置没有任何问题,但问题出在Hub类中。

我在OnConnected方法中有一些自定义代码导致超时和/或错误(在那里建立了与外部服务和数据库的连接)。通过将工作分派给不同的流程(例如使用Hangfire或NServiceBus),我能够解决前面提到的问题。

事后看来,所描述的行为是完全有道理的。我在这里学到的教训是将ASP.NET中的控制器视为控制器:它们应该没有任何内容,应该包含有限的业务逻辑。