.NET Core连接Windows Server部署的Socket.IO服务出现ERR_SSL_PROTOCOL_ERROR
解决方案
ERR_SSL_PROTOCOL_ERROR本质是客户端用HTTPS/WSS协议请求了仅支持HTTP的端口,导致SSL握手失败,可按以下步骤逐一排查解决:
1. 关闭.NET Core默认HTTPS重定向
.NET Core Web项目默认启用HTTPS重定向中间件,会把所有HTTP请求自动跳转至HTTPS端口,你的Socket.IO服务监听的30080是纯HTTP端口,跳转后用HTTPS请求该端口必然触发SSL错误。
打开项目的Program.cs(.NET 6+)或Startup.cs(.NET 5及更早),注释掉如下代码:
// app.UseHttpsRedirection();
2. 匹配Socket.IO客户端版本
你服务端使用的是Socket.IO 3.1.2版本,.NET客户端必须使用对应3.x大版本,版本不兼容会导致握手逻辑异常,出现误报SSL错误的情况。
推荐通过NuGet安装匹配版本的客户端:
Install-Package SocketIOClient -Version 3.0.8
3. 修正.NET端连接代码
Access-Control-Allow-Origin是服务端返回的响应头,客户端不需要主动添加该请求头,多余的自定义头可能触发中间件拦截。参考正确的连接代码:
using SocketIOClient; // 初始化客户端 var socketClient = new SocketIO("http://你的服务器IP:30080", new SocketIOOptions { WithCredentials = false, // 优先指定WebSocket传输,避免HTTP轮询阶段的重定向问题 Transport = SocketIOTransport.WebSocket }); // 绑定事件 socketClient.On("connect", () => { Console.WriteLine("连接成功"); }); socketClient.On("message", response => { string msg = response.GetValue<string>(); Console.WriteLine(msg); }); // 发起连接 await socketClient.ConnectAsync();
4. 排查服务器部署拦截问题
- 若.NET应用部署在IIS上,需先安装IIS的WebSocket功能,同时检查是否配置了全局反向代理规则,导致30080端口的请求被强制跳转HTTPS
- 同一台服务器测试时,优先用
127.0.0.1代替公网IP,避免端口回流拦截 - 确认Windows Server防火墙开放了30080端口的入站规则
5. 如需启用HTTPS/WSS的配置方案
如果业务要求使用加密连接,不能直接用现有HTTP端口接HTTPS请求,需要给Node端Socket.IO服务配置SSL证书:
const https = require('https'); const fs = require('fs'); // 加载你的SSL证书和密钥 const options = { key: fs.readFileSync('你的私钥路径.key'), cert: fs.readFileSync('你的证书路径.crt') }; const httpServer = https.createServer(options); // 其余Socket.IO配置保持不变,监听端口可改为30443等自定义端口
配置完成后.NET端用https://你的服务器IP:30443或wss://你的服务器IP:30443连接即可。
内容的提问来源于stack exchange,提问作者noleavename
相关产品推荐
相关产品推荐

