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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 07:18:02