ASP.Net Core对接无服务器模式Azure SignalR及与Azure Function共享服务实现问询
实现ASP.NET Core与Azure Functions共享无服务器模式SignalR Service方案
该需求可完全实现,无服务器模式下Azure SignalR本身支持多个上游服务共享实例,操作步骤如下:
1. 前置准备校验
- 确认Azure SignalR服务已切换为无服务器模式,该模式下不支持Default模式的服务端Hub长连接,所有上游服务(ASP.NET Core、Azure Functions)均通过REST接口调用SignalR服务发消息
- 复制SignalR服务的连接字符串,ASP.NET Core和Azure Functions需使用相同的连接字符串接入
2. ASP.NET Core端无服务器模式适配
不要使用Default模式的AddSignalR().AddAzureSignalR()配置,改用无服务器专属的管理SDK:
- 安装NuGet包:
Microsoft.Azure.SignalR.Management - 服务注册代码示例:
builder.Services.AddSignalRServiceManager(options => { options.ConnectionString = "你的Azure SignalR连接字符串"; options.ServiceTransportType = ServiceTransportType.Transient; // 无服务器模式固定配置 });
- 发消息代码示例,无需启动Hub服务也无需配置Hub路由,仅需定义Hub契约即可:
private readonly IServiceManager _serviceManager; // 构造函数注入IServiceManager public YourBusinessService(IServiceManager serviceManager) { _serviceManager = serviceManager; } public async Task PushMessageAsync(string targetUserId, string content) { // 传入约定的统一Hub名称创建上下文 var hubContext = await _serviceManager.CreateHubContextAsync<YourHub>("约定的Hub名称"); // 调用和Azure Functions侧对齐的消息方法名推送内容 await hubContext.Clients.User(targetUserId).SendAsync("ReceiveMessage", content); }
3. 客户端统一协商配置
所有客户端的SignalR连接凭证,统一从同一个协商接口获取即可,可选择用现有Azure Functions的SignalR协商绑定接口,也可选择在ASP.NET Core侧实现协商接口:
[HttpGet("signalr/negotiate")] public async Task<IActionResult> Negotiate(string userId) { var credential = await _serviceManager.GenerateClientEndpointAsync("约定的Hub名称", userId); return Ok(credential); }
4. Azure Functions侧配置保持不变
现有适配无服务器模式的Azure Functions代码无需改动,只要保证满足以下对齐规则即可:
- 使用同一个SignalR服务连接字符串
- 使用相同的Hub名称
- 用户ID、分组ID的生成规则和ASP.NET Core侧完全对齐
- 收发消息的方法名、参数结构和ASP.NET Core侧完全一致
5. 常见问题排查
- 无服务器模式下禁止在ASP.NET Core侧配置
app.MapHub<YourHub>()路由,会触发模式不兼容报错 - 如果消息无法互通,优先校验Hub名称、方法名、用户ID规则是否两边一致
内容的提问来源于stack exchange,提问作者Anna Melashkina
相关产品推荐
相关产品推荐

