SignalR核心:启用Web套接字并将Azure应用服务扩展到多个实例时,是否需要ARR关联性?

时间:2019-06-27 16:52:39

标签: azure asp.net-core websocket azure-web-app-service asp.net-core-signalr

我正在开发asp.net core 2.2 MVC Web应用程序。我们正在使用signal r core version 1.1.0(通过nuget包Microsoft.AspNetCore.SignalR添加)。客户端应用程序是引用1.1.4 JavaScript库的版本aspnet-signalr的angularjs应用程序。

我们的应用程序已部署在Azure上,并且托管应用程序服务是水平扩展的:当前two instances个Web应用程序已启动并正在运行。我正在Windows 10计算机上使用Google chrome version 75.0.3770.100测试应用程序的行为。

已配置应用程序服务,以便启用Web套接字并禁用ARR关联性。我遇到一种奇怪的行为,基本上是如果我测试我的应用程序并执行几次浏览器硬刷新(Ctrl + F5),则客户端应用程序无法连接到通知中心会随机发生。谷歌浏览器控制台报告了以下错误:

WebSocket connection to 'wss://myapp.azurewebsites.net/notificationsHub?id=3Fmlw2yC5qm3vi0qny50Qg' failed: Error during WebSocket handshake: Unexpected response code: 404

Error: Failed to start the transport 'WebSockets': null

GET https://myapp.azurewebsites.net/notificationsHub?id=nEYPEDw5f0AkLz5otCAOyA 404

Error: Failed to start the transport 'ServerSentEvents': Error: Error occurred

GET https://myapp.azurewebsites.net/notificationsHub?id=2G9VVr5mcx7QT2wbSfwDLA&_=1561652513485 404

Error: Failed to start the transport 'LongPolling': Error

Error: Failed to start the connection: Error: Unable to initialize any of the available transports.

如果我更改应用程序服务配置,以便同时启用了Web套接字和ARR关联性,则所有操作都像超级按钮一样。我的可疑之处是当应用服务水平扩展时,无论传输协议如何,都需要ARR关联性(在我的情况下,服务器端应用程序和客户端浏览器都能够支持Web套接字协议)

根据我的理解,微软官方文档指出,使用Web套接字作为通信协议时,即使将托管应用程序服务水平扩展到多个实例,也不需要客户端ARR关联。在这一点上,我不确定我对信号器核心文档的理解。

我想念什么吗?我是否误解了官方文件?

编辑2019年7月3日

对于对此主题感兴趣的人员(使用signal-r核心扩展Web应用程序),您可以参考this github issue以获得所有详细信息。

简短的答案是,新的signal-r内核实际上是有状态的,并且在应用程序扩展到多个服务器时需要粘性会话。

如果仅使用Azure,则可以避免使用粘性会话,而使用Azure signalr service可以带来其他好处。

如果您不想使用此azure服务,避免粘滞会话的唯一选择是配置信号r核心,从而避免客户端-服务器协议协商,并且仅通过使用Web套接字来进行通信< / strong>(有关所有详细信息,请参阅链接的github问题)。请注意,这样做会在不支持Web套接字的情况下失去降级到其他协议的能力,这是signal-r核心的核心功能之一。

1 个答案:

答案 0 :(得分:1)

如果您想禁用关联,那么我认为您缺少的组件是托管的SignalR服务。当您的应用程序服务扩展时,代理服务将为您maintain会话信息。请遵循以下steps的操作,将SignalR服务作为服务依赖项添加到您的项目中。