我们在生产中确实很难诊断出一个问题。症状是,使用SignalR时,服务器上的一个或多个线程会定期挂起。当发生这种情况时,除非其中一个线程也遇到此问题,否则其他线程似乎会继续快乐。
没有记录任何错误,但是创建转储会揭示线程在以下位置遇到ObjectDisposedException:
System.Net.Sockets.SafeCloseSocket.GetOrAllocateThreadPoolBoundHandle(Boolean)
System.Net.Sockets.Socket.GetOrAllocateThreadPoolBoundHandleSlow()
System.Net.Sockets.SocketAsyncEventArgs.DoOperationSendSingleBuffer(System.Net.Sockets.SafeCloseSocket)
System.Net.Sockets.Socket.SendAsync(System.Net.Sockets.SocketAsyncEventArgs)
如果我们在客户端禁用SignalR,就没有问题。
我们已经将websocket功能缩减到只创建一个空集线器的位置,问题仍然存在。
我们用以下方法初始化SignalR:
services.AddSignalR();
app.UseSignalR(routes =>
{
routes.MapHub<LiveHub>("/live");
});
LiveHub.cs的内容是:
public class LiveHub : Hub<ILiveHub>
{
public Task Ping()
{
return Clients.Caller.SendMessage("pong");
}
}
我们在Application Loadbalancer后面的AWS上运行,但目前仅在一台服务器上运行。
还有其他人有这个问题吗?