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

.NET隔离模式Azure Function处理Service Bus多消息失败求助

解决Azure Functions升级后ServiceBus触发器参数转换异常问题

升级到Azure Functions SDK(隔离进程模型)后,ServiceBus触发器的默认输入转换器不会自动将队列消息的字符串内容转换为string[]类型,因此抛出FunctionInputConverterException。以下是两种可行的解决方案:

方案1:手动处理消息反序列化

将函数参数类型改为string,在函数体内显式将消息内容反序列化为string[]:

修改Function.cs:

using System;
using System.Text.Json;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Extensions.Logging;

public class MyFunction
{
    private readonly ILogger _logger;

    public MyFunction(ILoggerFactory loggerFactory)
    {
        _logger = loggerFactory.CreateLogger<MyFunction>();
    }

    [Function("QueueTrigger")]
    public void Run([ServiceBusTrigger("myqueue", Connection = "ServiceBusConnection")] string myQueueItem)
    {
        _logger.LogInformation("Received message: {Message}", myQueueItem);
        
        // 将字符串反序列化为string[]
        string[] items = JsonSerializer.Deserialize<string[]>(myQueueItem);
        
        // 后续业务逻辑处理
        foreach (var item in items)
        {
            _logger.LogInformation("Item: {Item}", item);
        }
    }
}

方案2:自定义输入转换器

如果需要保持参数为string[],可自定义转换器并注册到Worker服务:

  1. 创建自定义转换器类:
using System;
using System.Text.Json;
using Microsoft.Azure.Functions.Worker.Converters;

public class StringToArrayConverter : IInputConverter
{
    public ValueTask<ConversionResult> ConvertAsync(ConverterContext context)
    {
        if (context.Source is string messageContent && context.TargetType == typeof(string[]))
        {
            try
            {
                var result = JsonSerializer.Deserialize<string[]>(messageContent);
                return ValueTask.FromResult(ConversionResult.Success(result));
            }
            catch (Exception ex)
            {
                return ValueTask.FromResult(ConversionResult.Failed(ex));
            }
        }
        return ValueTask.FromResult(ConversionResult.Unhandled());
    }
}
  1. 在Program.cs中注册转换器:
using Microsoft.Azure.Functions.Worker;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

var host = new HostBuilder()
    .ConfigureFunctionsWorkerDefaults(builder =>
    {
        // 注册自定义转换器
        builder.Services.AddSingleton<IInputConverter, StringToArrayConverter>();
    })
    .Build();

host.Run();
  1. 修改Function.cs保持参数为string[]:
using Microsoft.Azure.Functions.Worker;
using Microsoft.Extensions.Logging;

public class MyFunction
{
    private readonly ILogger _logger;

    public MyFunction(ILoggerFactory loggerFactory)
    {
        _logger = loggerFactory.CreateLogger<MyFunction>();
    }

    [Function("QueueTrigger")]
    public void Run([ServiceBusTrigger("myqueue", Connection = "ServiceBusConnection")] string[] myQueueItem)
    {
        _logger.LogInformation("Received {Count} items", myQueueItem.Length);
        
        foreach (var item in myQueueItem)
        {
            _logger.LogInformation("Item: {Item}", item);
        }
    }
}

检查项目依赖

确保项目文件(.csproj)中引用了正确的匹配版本包:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net6.0</TargetFramework>
    <AzureFunctionsVersion>v4</AzureFunctionsVersion>
    <OutputType>Exe</OutputType>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Microsoft.Azure.Functions.Worker" Version="1.20.0" />
    <PackageReference Include="Microsoft.Azure.Functions.Worker.Extensions.ServiceBus" Version="5.11.0" />
    <PackageReference Include="Microsoft.Azure.Functions.Worker.Sdk" Version="1.16.0" />
  </ItemGroup>
  <ItemGroup>
    <None Update="host.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>
    <None Update="local.settings.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <CopyToPublishDirectory>Never</CopyToPublishDirectory>
    </None>
  </ItemGroup>
</Project>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 11:52:27