在我的生产环境中,我的应用程序大约有一半的时间在接受握手时遇到问题。在我的本地计算机和与生产环境相同的临时环境中,它每次都有效。
这是一个使用 aspnet-signalr/1.1.4 的 .Net Core 2.1 应用程序
我没有将 SignalR 配置为在启动中使用任何具体信息
app.UseSignalR(routes => { routes.MapHub<PortfolioHub>("/loadpagedetailsjob"); });
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Dashboard}/{action=Index}/{id?}");
});
我的PortfolioHub只是Hub类的直接实现
在我的页面
var connection = new signalR.HubConnectionBuilder()
.withUrl('/loadpagedetailsjob')
.configureLogging(signalR.LogLevel.Information)
.build();
connection.start().then(function () {
connection.invoke("Subscribe");
});
看起来它尝试协商 Web 套接字,然后进行长轮询,但都失败了。但请求返回200
因为这种情况只是有时发生,所以我在解决问题时遇到了问题。此时我唯一的怀疑是,由于我的环境位于 AWS 中,负载平衡后,协商请求被路由到不同的服务器,这可能会导致问题?
感谢任何帮助。
最佳答案
SignalR 要求一个连接始终由同一台服务器处理。典型的解决方案是将负载均衡器配置为使用粘性 session 。启用粘性 session 后,负载均衡器会将同一用户的请求路由到同一后端服务器。
https://learn.microsoft.com/en-us/aspnet/core/signalr/scale?view=aspnetcore-3.1
关于asp.net-core - 有时 SignalR "Error during WebSocket handshake",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60601552/