SignalR WebSockets 在本地工作但不在服务器上工作
SignalR WebSockets work locally but not on server
我正在尝试让 Web 套接字作为使用 SignalR 2.4.2 的 ASP.NET 4.8 Framework 应用程序的协议。它适用于本地主机上的 Visual Studio 2019,运行 Windows 10 Pro。它在 Windows 2016 服务器(不是 Azure)上失败,并在 Chrome 85:
中出现此错误
signalr?v=igzza46L1gfiUBzl96WDUmuI9_CUHV_qqd0Kd-fDr8A1:1 WebSocket connection to 'wss://someServer.org/signalr/connect?transport=webSockets&clientProtocol=2.1&connectionToken=...&connectionData=%5B%7B%22name%22%3A%22myhub%22%7D%5D&tid=0' failed: Error during WebSocket handshake: net::ERR_CONNECTION_RESET
和
No transport could be initialized successfully. Try specifying a different transport or none at all for auto initialization.
at Object.error (signalr?vv=...:1)
at g (signalr?vv=...:1)
at v (signalr?vv=...:1)
at h.transportFailed (signalr?vv=...:1)
at signalr?vv=...:1
at WebSocket.e.socket.e.socket.onclose (signalr?vv=...:1)
在服务器 https://myserver.org/signalr/negotiate
上打开此 URL 以获取 SignalR 详细信息会产生以下内容:
Url "/signalr"
ConnectionToken "..."
ConnectionId "..."
KeepAliveTimeout 20
DisconnectTimeout 30
ConnectionTimeout 110
TryWebSockets true
ProtocolVersion "1.2"
TransportConnectTimeout 5
LongPollDelay 0
这是 Firefox 中针对失败调用的控制台响应链:
SignalR: Client subscribed to hub 'myhub'.
SignalR: Negotiating with '/signalr/negotiate?clientProtocol=2.1&connectionToken=...&connectionData=%5B%7B%22name%22%3A%22myhub%22%7D%5D'.
SignalR: webSockets transport starting.
SignalR: 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'
Firefox can’t 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.
SignalR: Websocket closed.
SignalR: Closing the Websocket.
SignalR: webSockets transport failed to connect. Attempting to fall back.
SignalR: No fallback transports were selected.
SignalR: Stopping connection.
SignalR: Fired ajax abort async = true.
已使用这些说明在服务器上安装 WebSockets:
- https://docs.microsoft.com/en-us/iis/configuration/system.webserver/websocket#windows-server-2012-or-windows-server-2012-r2
- https://docs.microsoft.com/en-us/iis/configuration/system.webserver/websocket#how-to-configure-websocket
在客户端上,它使用以下内容:
$.connection.hub.logging = true;
$.connection.hub.start({ transport: ['webSockets'] })
.done(function () {
// ...
}).fail(e => {
console.log(e);
});;
此外,BrowserLink 在 Visual Studio 中被禁用,因为有人提到这可能是问题的原因。
研究的其他文章:
有人建议从 Global.asax.cs
中删除 Application_PreSendRequestHeaders
但这并没有改变服务器上的任何内容。
我知道 SignalR 支持其他协议,但我正在尝试让 Web 套接字正常工作。
谢谢。
更新: web sockets协议也可以在服务器本身的本地主机上工作,通过RDP登录并使用浏览器打开页面。
这是一个棘手的问题。与系统管理员合作,我们发现它是由负载 balance/proxy 级别引起的,它位于我们所有流量的前面。默认情况下,它不支持网络套接字。启用网络套接字后,SignalR 很高兴。
我正在尝试让 Web 套接字作为使用 SignalR 2.4.2 的 ASP.NET 4.8 Framework 应用程序的协议。它适用于本地主机上的 Visual Studio 2019,运行 Windows 10 Pro。它在 Windows 2016 服务器(不是 Azure)上失败,并在 Chrome 85:
中出现此错误signalr?v=igzza46L1gfiUBzl96WDUmuI9_CUHV_qqd0Kd-fDr8A1:1 WebSocket connection to 'wss://someServer.org/signalr/connect?transport=webSockets&clientProtocol=2.1&connectionToken=...&connectionData=%5B%7B%22name%22%3A%22myhub%22%7D%5D&tid=0' failed: Error during WebSocket handshake: net::ERR_CONNECTION_RESET
和
No transport could be initialized successfully. Try specifying a different transport or none at all for auto initialization.
at Object.error (signalr?vv=...:1)
at g (signalr?vv=...:1)
at v (signalr?vv=...:1)
at h.transportFailed (signalr?vv=...:1)
at signalr?vv=...:1
at WebSocket.e.socket.e.socket.onclose (signalr?vv=...:1)
在服务器 https://myserver.org/signalr/negotiate
上打开此 URL 以获取 SignalR 详细信息会产生以下内容:
Url "/signalr"
ConnectionToken "..."
ConnectionId "..."
KeepAliveTimeout 20
DisconnectTimeout 30
ConnectionTimeout 110
TryWebSockets true
ProtocolVersion "1.2"
TransportConnectTimeout 5
LongPollDelay 0
这是 Firefox 中针对失败调用的控制台响应链:
SignalR: Client subscribed to hub 'myhub'.
SignalR: Negotiating with '/signalr/negotiate?clientProtocol=2.1&connectionToken=...&connectionData=%5B%7B%22name%22%3A%22myhub%22%7D%5D'.
SignalR: webSockets transport starting.
SignalR: 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'
Firefox can’t 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.
SignalR: Websocket closed.
SignalR: Closing the Websocket.
SignalR: webSockets transport failed to connect. Attempting to fall back.
SignalR: No fallback transports were selected.
SignalR: Stopping connection.
SignalR: Fired ajax abort async = true.
已使用这些说明在服务器上安装 WebSockets:
- https://docs.microsoft.com/en-us/iis/configuration/system.webserver/websocket#windows-server-2012-or-windows-server-2012-r2
- https://docs.microsoft.com/en-us/iis/configuration/system.webserver/websocket#how-to-configure-websocket
在客户端上,它使用以下内容:
$.connection.hub.logging = true;
$.connection.hub.start({ transport: ['webSockets'] })
.done(function () {
// ...
}).fail(e => {
console.log(e);
});;
此外,BrowserLink 在 Visual Studio 中被禁用,因为有人提到这可能是问题的原因。
研究的其他文章:
有人建议从 Global.asax.cs
中删除 Application_PreSendRequestHeaders
但这并没有改变服务器上的任何内容。
我知道 SignalR 支持其他协议,但我正在尝试让 Web 套接字正常工作。
谢谢。
更新: web sockets协议也可以在服务器本身的本地主机上工作,通过RDP登录并使用浏览器打开页面。
这是一个棘手的问题。与系统管理员合作,我们发现它是由负载 balance/proxy 级别引起的,它位于我们所有流量的前面。默认情况下,它不支持网络套接字。启用网络套接字后,SignalR 很高兴。