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

.NET 8孤立进程中IAsyncCollector<SignalRMessage>等效实现及函数签名转换

.NET 8 孤立进程模型下 Azure Function SignalR SendMessage 等效实现

原.NET 6 进程内模型参考代码

先贴出你提到的进程内模型中可正常工作的SendMessage函数作为对比:

[FunctionName("SendMessage")]
public static async Task<IActionResult> SendMessage(
    [HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = null)] HttpRequest req,
    [SignalR(HubName = "chat")] IAsyncCollector<SignalRMessage> signalRMessages)
{
    var message = await req.ReadFromJsonAsync<Message>();
    await signalRMessages.AddAsync(new SignalRMessage
    {
        Target = "newMessage",
        Arguments = new[] { message }
    });
    return new OkResult();
}

.NET 8 孤立进程等效函数签名

在孤立进程模型中,函数属性、触发器参数类型和SignalR绑定都有调整,以下是几种可行的等效实现:

1. 使用ICollector(同步收集器)

这是IAsyncCollector<SignalRMessage>的直接替代方案,适合同步或异步函数:

public class SignalRFunctions
{
    [Function("SendMessage")] // 替换原[FunctionName]属性
    public async Task<IActionResult> SendMessage(
        [HttpTrigger(AuthorizationLevel.Anonymous, "post")] HttpRequestData req, // 替换HttpRequest为HttpRequestData
        [SignalROutput(HubName = "chat")] ICollector<SignalRMessage> signalRMessages) // 替换[SignalR]为[SignalROutput]
    {
        var message = await req.ReadFromJsonAsync<Message>();
        signalRMessages.Add(new SignalRMessage
        {
            Target = "newMessage",
            Arguments = new[] { message }
        });
        return new OkResult();
    }
}

2. 直接返回SignalRMessage(单条消息场景)

如果仅需发送单条消息,可直接将消息作为函数返回值,无需收集器:

[Function("SendSingleMessage")]
public async Task<SignalRMessage> SendSingleMessage(
    [HttpTrigger(AuthorizationLevel.Anonymous, "post")] HttpRequestData req)
{
    var message = await req.ReadFromJsonAsync<Message>();
    return new SignalRMessage
    {
        HubName = "chat", // 需在消息中指定HubName,替代绑定属性
        Target = "newMessage",
        Arguments = new[] { message }
    };
}

3. 返回IEnumerable(多条消息场景)

如果要发送多条消息,可返回消息集合:

[Function("SendMultipleMessages")]
public async Task<IEnumerable<SignalRMessage>> SendMultipleMessages(
    [HttpTrigger(AuthorizationLevel.Anonymous, "post")] HttpRequestData req)
{
    var messages = await req.ReadFromJsonAsync<List<Message>>();
    return messages.Select(msg => new SignalRMessage
    {
        HubName = "chat",
        Target = "newMessage",
        Arguments = new[] { msg }
    });
}

IAsyncCollector的替代说明

在.NET 8孤立进程模型中,IAsyncCollector<SignalRMessage>不再被支持,推荐以下两种替代方案:

  • ICollector:同步收集器,调用Add()方法添加消息,底层会自动处理异步发送逻辑,兼容同步/异步函数。
  • 直接返回消息/消息集合:无需收集器,直接将SignalRMessage或IEnumerable<SignalRMessage>作为函数返回值,需在消息实例中指定HubName。

注意事项

  • 确保安装NuGet包:Microsoft.Azure.Functions.Worker.Extensions.SignalRService(版本≥1.1.0以支持.NET 8孤立进程)
  • 孤立进程中函数需定义在普通类中(无需static),属性从[FunctionName]改为[Function]
  • HTTP触发器参数从HttpRequest改为HttpRequestData

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 06:27:45