You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SignalR Core中确定传输方式?

嘿,这个问题我之前也碰到过!ASP.NET Core SignalR确实把旧版里通过queryString["transport"]拿传输方式的逻辑改了,你现在用请求头判断是没问题,但其实框架已经提供了更直接、可靠的方式,不用自己去解析那些头信息~

利用ITransportFeature直接获取传输类型

ASP.NET Core SignalR在每个连接的特性集合里内置了ITransportFeature接口,它直接封装了当前连接使用的传输方式,完全不需要手动解析请求头或者查询字符串。

在Hub中获取传输方式

这是最常见的场景,在Hub方法里可以通过Context.Features直接获取:

public async Task GetCurrentTransport()
{
    // 从上下文特性中获取ITransportFeature
    var transportFeature = Context.Features.Get<ITransportFeature>();
    
    if (transportFeature != null)
    {
        // TransportType是枚举,包含WebSockets、LongPolling、ServerSentEvents三种值
        var transportType = transportFeature.TransportType;
        string transportMethod = transportType.ToString();
        
        // 比如WebSocket连接会拿到"WebSockets",长轮询是"LongPolling",服务器发送事件是"ServerSentEvents"
        await Clients.Caller.SendAsync("ReceiveTransportInfo", $"当前传输方式:{transportMethod}");
    }
}

在中间件中获取传输方式

如果需要在Hub之外(比如请求管道的中间件里)判断传输方式,也可以从HttpContext的特性集合里获取:

app.Use(async (context, next) =>
{
    var transportFeature = context.Features.Get<ITransportFeature>();
    
    if (transportFeature != null)
    {
        // 这里可以根据传输类型做自定义逻辑,比如日志记录
        Console.WriteLine($"当前连接使用的传输方式:{transportFeature.TransportType.Name}");
    }
    
    await next();
});

为什么这是更优的方案?

  • 可靠性更高:不用自己维护请求头的判断逻辑,框架会自动处理传输方式的识别,避免因为头信息格式变化导致判断错误。
  • 代码更简洁:一行代码就能拿到明确的传输类型枚举值,比解析多个请求头要直观得多。
  • 扩展性更好:如果以后SignalR新增了传输方式,TransportType枚举会同步更新,你的代码不用做任何修改就能兼容。

内容的提问来源于stack exchange,提问作者Dave New

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:04:39