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

SignalR WebSockets work locally but not on server(SignalR WebSocket在本地工作,但不在服务器上工作)

本文介绍了SignalR WebSocket在本地工作,但不在服务器上工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试让Web Sockets与使用SignalR 2.4.2的ASP.NET4.8框架应用程序一起作为协议工作。它在本地主机上运行Windows 10专业版的Visual Studio 2019上运行得很好。它在Windows 2016服务器(不是Azure)上失败,Chrome 85中出现此错误:

signalr?v=igzza46L1gfiUBzl96WDUmuI9_CUHV_qqd0Kd-fDr8A1:1与‘wss://someServer.org/signalr/connect?transport=webSockets&;clientProtocol=2.1&;connectionToken=...&;connectionData=%5B%7B%22name%22%3A%22myhub%22%7D%5D&;tid=0’的WebSocket连接失败:WebSocket握手期间出错: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)

在服务器上打开此URLhttps://myserver.org/signalr/negotiate以获取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);
    });;

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

其他研究文章:

  • https://stackoverflow.com/a/37531108/177416
  • https://github.com/SignalR/SignalR/issues/3148

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

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

谢谢。

更新:Web套接字协议还可以在服务器本身的本地主机上工作,通过RDP登录并使用浏览器打开页面。

推荐答案

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

这篇关于SignalR WebSocket在本地工作,但不在服务器上工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本文标题为:SignalR WebSocket在本地工作,但不在服务器上工作

基础教程推荐