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

基于Python开发SignalR客户端遇无效connectionId问题求助

Python SignalR客户端适配.Net Framework 4.8 SSE传输时connectionId无效问题

问题描述

我正尝试用Python开发SignalR客户端,调研过signalr、signalrcore等库,但目标SignalR Hub基于.Net Framework 4.8开发,且采用Server-Sent Events (SSE)传输方式,这些库均无法适配。

已在.Net客户端实现完整流程:与Hub协商获取connectionId后调用API触发事件流,完全正常。但Python复现时,调用触发API返回“invalid connectionId”错误,具体步骤如下:

  • 发起协商请求,成功获取connectionToken、connectionId等元数据;
  • 使用connectionToken连接SignalR Hub,SSE连接建立成功,但始终接收空消息;
  • 携带获取到的connectionId调用触发API,返回无效connectionId错误(.Net客户端拿到的connectionId可正常调用)。

寻求SignalR或DesigoCC相关技术人士帮助。

可能的解决方案

1. 对齐协商请求的参数与.Net客户端

.Net Framework 4.8的SignalR协商请求有特定参数要求:

  • 必须指定clientProtocol为1.5(旧版SignalR协议版本);
  • 同步.Net客户端的请求头(比如X-Requested-With: XMLHttpRequest)和Query参数(比如transport=serverSentEvents),确保Python请求的参数、头信息和.Net客户端完全一致。

2. 验证connectionId的传递方式

部分旧版SignalR Hub要求触发API时,connectionId需放在特定Header中(比如X-SignalR-ConnectionId),而非Query参数或请求体。对比.Net客户端的请求日志,确认connectionId的传递位置、格式是否完全匹配。

3. 维持SSE连接的活跃状态

旧版SignalR的SSE连接依赖心跳包维持会话,Python建立连接后需模拟心跳:

  • 服务器返回data: initialized\n\n后,定期发送data: ping\n\n格式的帧;
  • 若未正确处理心跳,服务器会标记connectionId为无效,导致后续API调用失败。

4. 手动构建旧版SignalR协议帧

现有库不兼容时,可手动实现SSE协议逻辑:

  • SSE连接URL格式:{hub_url}/connect?transport=serverSentEvents&connectionToken={token}&clientProtocol=1.5;
  • 连接建立后,发送注册Hub的帧:data: {"H":"{hub_name}","M":"{method_name}","A":[],"I":0}\n\n(按需替换hub名称和方法名)。

5. 同步会话Cookie

旧版SignalR依赖Cookie维持会话,Python请求需同步所有Cookie:

  • 使用CookieJar保存协商请求返回的Cookie(如ASP.NET_SessionId、.ASPXAUTH);
  • 连接Hub、调用触发API时,携带相同Cookie,确保服务器识别为同一会话。

内容的提问来源于stack exchange,提问作者Suroor Ahmmad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 08:52:01