SignalR WebSockets 在本地工作,但不在服务器上工作

Ale*_*lex 6 asp.net asp.net-mvc websocket signalr

我正在尝试让 Web Sockets 作为使用 SignalR 2.4.2 的 ASP.NET 4.8 Framework 应用程序的协议。它可以在本地主机上运行 Windows 10 Pro 的 Visual Studio 2019 上正常运行。它在 Windows 2016 服务器(不是 Azure)上失败,并在 Chrome 85 中出现以下错误:

\n
\n

signalr?v=igzza46L1gfiUBzl96WDUmuI9_CUHV_qqd0Kd-fDr8A1:1 WebSocket 连接到 \'wss://someServer.org/signalr/connect?transport=webSockets&clientProtocol=2.1&connectionToken=...&connectionData=%5B%7B%22name%22%3A%22myhub %22%7D%5D&tid=0\' 失败:WebSocket 握手期间出错:net::ERR_CONNECTION_RESET

\n
\n

\n
No transport could be initialized successfully. Try specifying a different transport or none at all for auto initialization.\n  at Object.error (signalr?vv=...:1)\n  at g (signalr?vv=...:1)\n  at v (signalr?vv=...:1)\n  at h.transportFailed (signalr?vv=...:1)\n  at signalr?vv=...:1\n  at WebSocket.e.socket.e.socket.onclose (signalr?vv=...:1)\n
Run Code Online (Sandbox Code Playgroud)\n

在服务器上打开此 URLhttps://myserver.org/signalr/negotiate以获取 SignalR 详细信息会产生以下结果:

\n
Url "/signalr"\nConnectionToken "..."\nConnectionId    "..."\nKeepAliveTimeout    20\nDisconnectTimeout   30\nConnectionTimeout   110\nTryWebSockets   true\nProtocolVersion "1.2"\nTransportConnectTimeout 5\nLongPollDelay   0   \n
Run Code Online (Sandbox Code Playgroud)\n

以下是 Firefox 中针对失败调用的控制台响应链:

\n
SignalR: Client subscribed to hub \'myhub\'. \nSignalR: Negotiating with \'/signalr/negotiate?clientProtocol=2.1&connectionToken=...&connectionData=%5B%7B%22name%22%3A%22myhub%22%7D%5D\'. \nSignalR: webSockets transport starting. \nSignalR: Connecting to websocket endpoint \'wss://myServer.org/signalr/connect?transport=webSockets&clientProtocol=2.1&connectionToken=...%3D%3D&connectionData=%5B%7B%22name%22%3A%22myhub%22%7D%5D&tid=8\'\nFirefox can\xe2\x80\x99t establish a connection to the server at wss://myServer.org/signalr/connect?transport=webSockets&clientProtocol=2.1&connectionToken=...&connectionData=%5B%7B%22name%22%3A%22myhub%22%7D%5D&tid=8.\nSignalR: Websocket closed. \nSignalR: Closing the Websocket. \nSignalR: webSockets transport failed to connect. Attempting to fall back. \nSignalR: No fallback transports were selected. \nSignalR: Stopping connection. \nSignalR: Fired ajax abort async = true.\n
Run Code Online (Sandbox Code Playgroud)\n

WebSockets 已使用以下说明安装在服务器上:

\n\n

在客户端上,它使用以下内容:

\n
$.connection.hub.logging = true;\n$.connection.hub.start({ transport: [\'webSockets\'] })\n   .done(function () {\n    // ...\n   }).fail(e => {\n        console.log(e);\n    });;\n
Run Code Online (Sandbox Code Playgroud)\n

此外,BrowserLink 在 Visual Studio 中被禁用,因为这被认为是导致问题的可能原因。

\n

研究的其他文章:

\n\n

有些人建议删除Application_PreSendRequestHeadersfromGlobal.asax.cs但这并没有改变服务器上的任何内容。

\n

我知道 SignalR 支持其他协议,但我正在尝试让 Web 套接字正常工作。

\n

谢谢。

\n

更新: Web 套接字协议也适用于服务器本身的本地主机,通过 RDP 登录并使用浏览器打开页面。

\n

Ale*_*lex 6

这是一个很难解决的问题。与系统管理员合作,我们发现这是由负载平衡/代理级别引起的,它位于我们所有流量的前面。默认情况下,它不支持网络套接字。一旦启用了 Web 套接字,SignalR 就很高兴。