WebSocket 握手期间的 Socket.io 错误:意外的响应代码:500 windows server iis

Posted

技术标签:

【中文标题】WebSocket 握手期间的 Socket.io 错误:意外的响应代码:500 windows server iis【英文标题】:Socket.io Error during WebSocket handshake: Unexpected response code: 500 windows server iis 【发布时间】:2020-03-28 22:07:42 【问题描述】:

我有一个运行 Windows 服务器的 EC2 实例。在 windows 服务器上,我安装了 IIS。这会处理提供 http 请求。

我使用https://github.com/win-acme/win-acme 来生成证书。然后我使用 IIS 管理器使用默认站点添加它。

然后我在https://tecadmin.net/set-up-reverse-proxy-using-iis/之后设置了一个反向代理

完成所有这些设置后,我终于在端口:4000 上启动了我的 node.js 服务器。此端口被代理到:80。

我向服务器发出 HTTP 请求并遇到两个我不理解的主要问题。

一个是使用https://socket.io/ 在我的node.js 服务器中设置的Websockets 显示failed: Error during WebSocket handshake: Unexpected response code: 500

第二个主要问题是我的请求进行了一些处理,需要一两分钟才能完成。中途就失败了。我不确定这是为什么。

在设置 HTTPS 之前,它是通过我的 MAC 上的 localhost 工作的。 HTTPS 不允许通过 HTTP 发出请求。所以这就是为什么我必须在我的 Windows 服务器上设置 HTTPS。自从我设置 HTTPS 以来,我一直遇到这个问题。所以我很确定这与我上面描述的设置有关。

任何见解都会令人惊叹!

【问题讨论】:

我尝试在 Windows 机器上本地运行它,它运行良好。这只是在 HTTPS 上服务时出现的问题 套接字连接正常。虽然没有数据发送到客户端 您能分享一下您的 web.config 文件吗?你的应用目标框架是什么? 【参考方案1】:

请确保您在 IIS 上安装并启用了 URL 重写和 ARR(应用程序请求路由缓存)模块。

对于这个例子,假设您的主要网站在 example.com 域下工作(https 和 http - 我通常使用 Letsencrypt 获取 HTTPS 证书)。我假设带有 socket.io 的节点在同一台服务器上(因此我使用下面的 127.0.0.1 地址)和端口 4000。

您不需要在节点上安装 SSL 证书,因为 IIS 会为您加密通信。

现在是配置 URL 重写模块的时候了(针对整个 IIS 服务器,而不是您的站点)。

如果你想让 websockets 也能在 http(ws) 和 https(wss) 上工作,你需要创建一个 rewritemap。我通常将其创建为“MapProtocol”。

你需要 4 条记录:

http -> http
https -> http
ws -> ws
wss -> ws

然后创建 URL Inbound Rewrite 规则

图案:

^socket\.io/([\s\S]*)

条件: HTTP_HOST 匹配模式 example.com CACHE_URL 匹配模式 ^(.+)://

服务器变量:

HTTP_Sec_WebSocket_Extensions -> none
Check 'replace the current value'

动作:重写

MapProtocol:C:1://127.0.0.1:4000/R:0
Check 'append the query string' and 'stop processing of subsequent rules'

就是这样。 您现在可以通过访问以下内容检查规则是否有效: http://example.com/socket.io/socket.io.js

https://example.com/socket.io/socket.io.js 如果您在您的网站上正确配置了 ssl 证书。

【讨论】:

以上是关于WebSocket 握手期间的 Socket.io 错误:意外的响应代码:500 windows server iis的主要内容,如果未能解决你的问题,请参考以下文章

WebSocket 握手期间出错:意外的响应代码:500

webSocket 握手期间的错误意外响应代码:400

AWS EB:WebSocket 握手期间出错:意外响应代码:400

Node.JS、Socket.IO 和集群中的 WebSocket 握手不起作用

Socket.io - 失败:连接在收到握手响应之前关闭

webSocket那些事之socket.io