- SignalR支持多种服务器推送方式:Websocket、Server-Sent Events、长轮询。默认按顺序尝试。
- F12查看协商过程。
- websocket和HTTP是不同的协议,为什么能用同一个端口。
- 在【开发人员工具】的【网络】页签中看WebSocket通信过程。
协议协商问题
- 集群中协议协商的问题:“协商”请求被服务器A处理,而接下来的WebSocket请求却被服务器B处理。
- 解决方法:粘性会话和禁用协商。
- “粘性会话”(Sticky Session):把来自同一个客户端的请求都转发给同一台服务器上。缺点:因为共享公网IP等造成请求无法被平均的分配到服务器集群;扩容的自适应性不强。
- “禁用协商”:直接向服务器发出WebSocket请求。WebSocket连接一旦建立后,在客户端和服务器端直接就建立了持续的网络连接通道,在这个WebSocket连接中的后续往返WebSocket通信都是由同一台服务器来处理。缺点:无法降级到“服务器发送事件”或“长轮询”,不过不是大问题。
禁用协议协商方式
//设置连接选项,跳过协商,使用WebSockets传输
const options = {skipNegotiation: true,transport: signalR.HttpTransportType.WebSockets
};
//创建连接
connection = new signalR.HubConnectionBuilder()
.withUrl('https://localhost:7181/MyHub',options)
.withAutomaticReconnect().build();
onMounted(async function () {//设置连接选项,跳过协商,使用WebSockets传输const options = {skipNegotiation: true,transport: signalR.HttpTransportType.WebSockets};//创建连接connection = new signalR.HubConnectionBuilder()// .withUrl('https://localhost:7181/MyHub').withUrl('https://localhost:7181/MyHub',options).withAutomaticReconnect().build();//开始连接await connection.start();//注册ReceivePublicMessage事件,接收消息,添加到messages数组connection.on('ReceivePublicMessage', msg => {state.messages.push(msg);});});