SignalR IIS With React - "Server returned handshake error: Handshake was canceled."

SignalR IIS With React - "Server returned handshake error: Handshake was canceled."

我正在开发一个由 IIS 10 托管的 .Net Core (3.1) Web 应用程序。当我尝试在本地主机上使用 SignalR 时,我能够完全正常地连接并从后端接收消息,但是在我发布之后它到 IIS,我得到错误:“服务器返回握手错误:握手被取消。”在客户端登录 Chrome 的控制台时,我收到消息:“信息:在我收到上述错误之前,SSE 已连接到 http://myserver.com/MyApplication/output"(您可能认为这意味着我已成功连接)。 .

我看到其他帖子有人建议我必须在 IIS 上启用 webSockets,我已经检查过我的网站是否启用了此功能。

我也看到有人建议在创建连接时尝试在 withUrl 函数中使用 longPolling 参数,但这也没有帮助。

我还在我的 web.config 文件中添加了 SignalR 事件日志跟踪侦听器,我收到的唯一可能与此问题相关的警告是我从 .NET 运行时收到一条警告,内容为“无法确定重定向的 https 端口。”我不确定这意味着什么,或者它是否与 SignalR 相关,但由于这似乎也与中间件有关,所以它可能很重要。

我认为可能相关的一件事是我的站点只是该服务器上托管的多个站点之一,因此当我在本地 运行 时,我可以使用以下内容连接到 SignalR:

hubConnection = new signalR.HubConnectionBuilder().withUrl("/output").build();

但是由于这个站点在我的服务器上的部署方式,我不得不使用这个:

hubConnection = new signalR.HubConnectionBuilder().withUrl("/MyApplication/output").build();

当我部署网站时,否则我会收到 404 错误...

会不会有什么问题?我在检查本地主机上的网络请求时注意到,与套接字连接的 URL 是“wss://localhost:44315/output?id=...”,我得到“状态代码:101 切换Protocols”,但在我部署之后,使用的 url 是“http://myserver.com/MyApplication/output?id=...”,在收到错误之前我得到了“200 OK”在顶部描述。为什么在本地主机上使用 wss 但在部署时从我的客户端请求 http?

经过几天的调试终于发现了这个问题...我在本地主机上收到“101”响应而不是在发布时收到的原因是因为 101 基本上是服务器(在我的例子中是 IIS)说“我支持网络插座”。我意识到因为我在发布时没有得到这个,所以 IIS 中可能没有启用 Web 套接字。然而,这很奇怪,因为我进入 IIS 管理器,它说 Web 套接字 已启用 ,但经过更多研究,我发现您还必须进入“服务器管理器”并启用它(请参阅此处 https://docs.microsoft.com/en-us/iis/get-started/whats-new-in-iis-8/iis-80-websocket-protocol-support 并按照分步说明进行操作)。我没有意识到两者都是必需的。