【问题标题】:SignalR IIS With React - "Server returned handshake error: Handshake was canceled."SignalR IIS with React - “服务器返回握手错误:握手被取消。”
【发布时间】:2021-01-08 01:42:10
【问题描述】:

我正在开发一个使用 IIS 10 托管的 .Net Core (3.1) Web 应用程序。当我尝试在 localhost 上使用 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 错误...

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

【问题讨论】:

  • 关于一般像这种网络问题,数据传输中断,建议你使用fiddler之类的工具来抓取网络数据包和流量包。拿到这些包后,分析其中的数据,找出中断的点和原因。

标签: reactjs asp.net-core iis signalr


【解决方案1】:

经过几天的调试终于发现了这个问题......我在本地主机上得到“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 并按照分步说明进行操作)。我没有意识到两者都是必需的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-11
    • 2017-03-19
    • 2016-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多