如何让Node.js的@microsoft/signalr(8.0.7)通过HTTP(S)代理建立WebSocket连接?
ASP.NET Core SignalR v8+ Node.js客户端配置HTTP(S)代理指南
前置依赖安装
首先确保安装所需包:
npm install @microsoft/signalr@8.0.7 https-proxy-agent ws
核心配置步骤
1. 创建HttpsProxyAgent实例
替换为你的公司代理地址,若需认证可直接在URL中携带用户名密码:
const { HttpsProxyAgent } = require("https-proxy-agent"); // 代理地址,带认证格式:http://username:password@proxy-host:port const proxyAgent = new HttpsProxyAgent("http://your-corporate-proxy:8080");
2. 配置HTTP协商请求代理
SignalR的初始/negotiate请求通过HTTP客户端发送,我们自定义DefaultHttpClient并注入代理:
const { DefaultHttpClient } = require("@microsoft/signalr"); const proxyHttpClient = new DefaultHttpClient({ handler: { agent: proxyAgent } });
3. 配置WebSocket传输代理
通过自定义WebSocket构造函数,给ws实例添加代理配置,同时保留SignalR原生传输逻辑:
const { WebSocketTransport } = require("@microsoft/signalr"); const WebSocket = require("ws"); const proxyWebSocket = (url) => { return new WebSocket(url, { agent: proxyAgent }); }; const webSocketTransport = new WebSocketTransport({ webSocketConstructor: proxyWebSocket });
4. 整合到HubConnection
将自定义的HTTP客户端和WebSocket传输注入HubConnection,保留原生重连等功能:
const { HubConnectionBuilder } = require("@microsoft/signalr"); const connection = new HubConnectionBuilder() .withUrl("https://your-signalr-hub-url/hub", { httpClient: proxyHttpClient, transport: webSocketTransport }) .withAutomaticReconnect() // 保留SignalR原生自动重连 .build(); // 连接及事件监听逻辑 connection.start() .then(() => console.log("SignalR连接成功")) .catch(err => console.error("连接失败:", err)); connection.on("ReceiveMessage", (user, message) => { console.log(`${user}: ${message}`); });
关键说明
- 此配置同时覆盖HTTP协商请求和WebSocket连接的代理需求,无需重写SignalR核心逻辑。
- 代理认证支持:直接在代理URL中拼接
username:password即可,例如http://admin:123456@proxy:8080。
内容的提问来源于stack exchange,提问作者Damian Popek
相关产品推荐
相关产品推荐

