隔离工作者模型下SignalR客户端无法获取Negotiate API响应
SignalR Negotiate API无响应问题排查
环境信息
- 客户端:基于
@microsoft/signalr@6.0.6的JavaScript程序 - 服务端依赖NuGet包:
- Microsoft.AspNetCore.Http v8.0
- Microsoft.Azure.Functions.Worker v1.21.0
- Microsoft.Azure.Functions.Worker.Extensions.SignalRService v1.13.0
- Microsoft.Azure.Functions.Worker.Sdk v1.17.0
服务端实现代码
using Microsoft.AspNetCore.Http; using Microsoft.Azure.Functions.Worker; using Microsoft.Extensions.Logging; namespace TestSignalRProj { public class SignalRNegotiate { private readonly ILogger<SignalRNegotiate> _logger; public SignalRNegotiate(ILogger<SignalRNegotiate> logger) { _logger = logger; } [Function(nameof(Negotiate))] public static string Negotiate( [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequest req, [SignalRConnectionInfoInput(HubName = "submission")] string connectionInfo) { return connectionInfo; } } }
问题现象
使用Postman调用该Negotiate API时无任何响应返回,附带相关截图:
排查与解决方案
1. 修正方法实例/静态属性冲突
当前Negotiate方法为静态方法,但类通过构造函数注入了ILogger依赖,静态方法无法访问实例级注入的服务,可能导致函数执行异常。将方法改为实例方法:
[Function(nameof(Negotiate))] public string Negotiate( [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequest req, [SignalRConnectionInfoInput(HubName = "submission")] string connectionInfo) { _logger.LogInformation("Negotiate API 请求已接收"); return connectionInfo; }
2. 验证SignalR服务连接配置
确保函数应用配置中已正确添加AzureSignalRConnectionString,值为SignalR Service的有效连接字符串,且该字符串具备生成连接信息的权限(避免使用只读连接字符串)。
3. 调整返回格式适配SignalR客户端
直接返回字符串可能导致响应内容类型非application/json,而SignalR客户端期望JSON格式的连接信息。可改为返回IActionResult确保格式正确:
using Microsoft.AspNetCore.Mvc; using Newtonsoft.Json; // ... public IActionResult Negotiate( [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequest req, [SignalRConnectionInfoInput(HubName = "submission")] string connectionInfo) { var connectionData = JsonConvert.DeserializeObject(connectionInfo); return Ok(connectionData); }
需额外安装Newtonsoft.Json NuGet包。
4. 启用详细日志定位异常
在host.json中配置更详细的日志级别,捕获函数执行过程中的异常信息:
{ "logging": { "logLevel": { "TestSignalRProj": "Information", "Microsoft.Azure.Functions.Worker": "Information" } } }
内容的提问来源于stack exchange,提问作者Hardik Patel
相关产品推荐
相关产品推荐

