.NET 5隔离进程Azure Function如何通过SignalR实时广播多条消息
.NET 5隔离进程Azure Function实时发送多条SignalR消息实现方案
方案一:集成SignalR客户端SDK手动发送(推荐,支持运行过程中实时逐条推送)
该方案完全替代原有IAsyncCollector的实时发送能力,每到业务步骤节点即可立即推送消息,没有延迟。
实现步骤:
- 安装SignalR客户端NuGet包
Install-Package Microsoft.AspNetCore.SignalR.Client
- 配置依赖注入(可选,推荐):在隔离进程的
Program.cs中注册单例的SignalR Hub连接,避免每次函数调用重复创建连接,降低性能损耗
var host = new HostBuilder() .ConfigureFunctionsWorkerDefaults() .ConfigureServices(services => { services.AddSingleton(sp => { var signalRConnStr = Environment.GetEnvironmentVariable("SignalRConnectionString"); var hubUrl = new Uri(new Uri(signalRConnStr.Split(';')[0].Split('=')[1]), "/api/hubs/Hub"); var accessKey = signalRConnStr.Split(';')[1].Split('=')[1]; var connection = new HubConnectionBuilder() .WithUrl(hubUrl, options => { options.AccessTokenProvider = () => Task.FromResult(accessKey); }) .WithAutomaticReconnect() // 配置自动重连 .Build(); // 启动连接 connection.StartAsync().Wait(); return connection; }); }) .Build(); host.Run();
- 改造函数签名,注入Hub连接,业务步骤中直接发送消息
public class MyFunction { private readonly HubConnection _hubConnection; public MyFunction(HubConnection hubConnection) { _hubConnection = hubConnection; } [Function("MyFunction")] public async Task Run( [ServiceBusTrigger("TopicName", "Subscription", Connection = "ConnectionString")] string message, FunctionContext functionContext) { var log = functionContext.GetLogger<MyFunction>(); // 业务步骤1:推送打开文件通知 await _hubConnection.SendAsync("newMessage", "正在打开文件"); // 执行业务逻辑 // 业务步骤2:推送进度通知 await _hubConnection.SendAsync("newMessage", "读取记录中 - 已完成10%"); // 后续业务步骤按需推送消息 await _hubConnection.SendAsync("newMessage", "准备展示记录"); } }
注意:如果不想用依赖注入,也可以在函数内部临时创建Hub连接,适合调用频率极低的场景,高并发场景下推荐使用单例连接避免连接数超限
方案二:使用输出绑定返回消息集合(仅支持函数执行完成后批量发送)
如果对消息实时性要求不高,允许函数执行完所有逻辑后统一推送所有消息,可以直接将返回值改为IEnumerable<CustomMessage>,输出绑定会自动批量发送所有消息:
[Function("MyFunction")] [SignalROutput(HubName = "Hub", ConnectionStringSetting = "SignalRConnectionString")] public async Task<IEnumerable<CustomMessage>> Run( [ServiceBusTrigger("TopicName", "Subscription", Connection = "ConnectionString")] string message, FunctionContext functionContext) { var messages = new List<CustomMessage>(); // 业务步骤1 messages.Add(new CustomMessage { Target = "newMessage", Arguments = new object[] { "正在打开文件" } }); // 业务步骤2 messages.Add(new CustomMessage { Target = "newMessage", Arguments = new object[] { "读取记录中 - 已完成10%" } }); // 业务步骤3 messages.Add(new CustomMessage { Target = "newMessage", Arguments = new object[] { "准备展示记录" } }); return messages; }
该方案的缺点是所有消息都会在函数执行完成后才统一推送,无法实现执行过程中的实时进度通知
内容的提问来源于stack exchange,提问作者MGith
相关产品推荐
相关产品推荐

