我遇到了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)。
答案 0 :(得分:1)
事实证明,客户端代码或SignalR的配置没有任何问题,但问题出在Hub类中。
我在OnConnected方法中有一些自定义代码导致超时和/或错误(在那里建立了与外部服务和数据库的连接)。通过将工作分派给不同的流程(例如使用Hangfire或NServiceBus),我能够解决前面提到的问题。
事后看来,所描述的行为是完全有道理的。我在这里学到的教训是将ASP.NET中的控制器视为控制器:它们应该没有任何内容,应该包含有限的业务逻辑。