ASP.NET Core SignalR的协议协商

  1. SignalR支持多种服务器推送方式:Websocket、Server-Sent Events、长轮询。默认按顺序尝试。
  2. F12查看协商过程。
  3. websocket和HTTP是不同的协议,为什么能用同一个端口。
  4. 在【开发人员工具】的【网络】页签中看WebSocket通信过程。

协议协商问题

  1. 集群中协议协商的问题:"协商"请求被服务器A处理,而接下来的WebSocket请求却被服务器B处理。
  2. 解决方法:粘性会话和禁用协商。
  3. "粘性会话"(Sticky Session):把来自同一个客户端的请求都转发给同一台服务器上。缺点:因为共享公网IP等造成请求无法被平均的分配到服务器集群;扩容的自适应性不强。
  4. "禁用协商":直接向服务器发出WebSocket请求。WebSocket连接一旦建立后,在客户端和服务器端直接就建立了持续的网络连接通道,在这个WebSocket连接中的后续往返WebSocket通信都是由同一台服务器来处理。缺点:无法降级到"服务器发送事件"或"长轮询",不过不是大问题。

禁用协议协商方式

javascript 复制代码
//设置连接选项,跳过协商,使用WebSockets传输
const options = {
    skipNegotiation: true,
    transport: signalR.HttpTransportType.WebSockets
};
//创建连接
connection = new signalR.HubConnectionBuilder()
.withUrl('https://localhost:7181/MyHub',options)
.withAutomaticReconnect().build();
javascript 复制代码
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);
      });
    });
相关推荐
lixww.cn1 个月前
ASP.NET Core用MediatR实现领域事件
ddd·asp.net core·mediatr
lixww.cn1 个月前
ASP.NET Core SignalR向部分客户端发消息
javascript·websocket·vue·asp.net core·signalr
lixww.cn1 个月前
ASP.NET Core SignalR的分布式部署
redis·消息队列·asp.net core·signalr
lixww.cn1 个月前
ASP.NET Core对JWT的封装
asp.net core·jwt·authorize
lixww.cn1 个月前
ASP.NET Core JWT Version
asp.net core·jwt·filter·identity
lixww.cn1 个月前
ASP.NET Core JWT
asp.net core·jwt
lixww.cn1 个月前
ASP.NET Core标识框架Identity
asp.net core·rbac·identity
lixww.cn1 个月前
ASP.NET Core中间件Markdown转换器
中间件·markdown·asp.net core
啊晚2 个月前
ASP.NET Core - 日志记录系统(二)
asp.net core