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

Excel插件连接Azure SignalR失败问题求助

问题:Excel插件连接Azure SignalR遇到403禁止错误

此前在WPF应用中成功用ASP.NET Core SignalR客户端连接Azure SignalR,但Office插件中使用该客户端会抛出DisposeAsync未实现异常,因此改用Microsoft.AspNet.SignalR.Client程序集。调用connection.Start().Wait()时触发403错误。

客户端代码

var query = new Dictionary<string, string>();
query.Add("version", "1.0");
query.Add("Authorization", GenerateAccessToken());
query.Add("hub", _hubName);

connection = new HubConnection(_endpoint, query);
connection.Headers.Add("Authorization", "Bearer " + GenerateAccessToken());
hubProxy = connection.CreateHubProxy(_hubName);

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;

connection.Start().Wait();

错误信息

HttpClientException: StatusCode: 403, ReasonPhrase: 'Forbidden', Version: 1.1, Content: System.Net.Http.StreamContent, Headers: 
{
  Connection: keep-alive
  Strict-Transport-Security: max-age=15724800; includeSubDomains
  Date: Sun, 25 Jun 2023 18:47:53 GMT
  Content-Length: 146
  Content-Type: text/html
}

Fiddler请求对比

  • WPF应用(正常返回200):
    POST https://<me>.service.signalr.net/client/negotiate?hub=default&negotiateVersion=1 
    
  • Excel插件(返回403):
    GET https://<me>.service.signalr.net/signalr/negotiate?clientProtocol=2.1&connectionData=%5B%7B%22Name%22:%22default%22%7D%5D&version=1.0&Authorization=(access_token.....)
    

核心疑问:无法修改端点路径(从signalr改为client)或请求方法,手动修改端点参数会抛出异常。


解决方案

1. 启用Azure SignalR服务的旧版协议兼容模式

Microsoft.AspNet.SignalR.Client属于旧版ASP.NET SignalR客户端,Azure SignalR默认适配新版ASP.NET Core SignalR,需开启兼容模式:

  • 登录Azure门户,进入你的SignalR服务实例
  • 进入设置 -> 功能页面,将兼容模式设置为ASP.NET SignalR
  • 保存配置,等待生效

2. 调整客户端代码

旧版客户端会自动拼接/signalr/negotiate路径,开启兼容模式后服务端会处理该路径,同时修正认证传递方式:

// 初始化HubConnection时直接传入服务根端点,不需要手动拼接路径
connection = new HubConnection("https://<me>.service.signalr.net");
// 仅在Headers中传递Bearer令牌,避免在Query中重复传递
connection.Headers.Add("Authorization", "Bearer " + GenerateAccessToken());
hubProxy = connection.CreateHubProxy(_hubName);

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;

connection.Start().Wait();

3. 验证令牌权限

确保生成的access_token具备访问Azure SignalR服务的权限:

  • 令牌需包含正确的scope(如https://signalr.azure.com/.default)
  • 检查Azure RBAC配置,确保令牌对应的身份有SignalR服务的访问权限

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 18:40:33