Search code examples
c#azureazure-functionsazure-servicebus-queues

Azure Function on a Service Bus Queue in .NET Isolation doesn't work for multiple messages


Recently I need to upgrade my Azure function from WebJobs.ServiceBus to Azure.Function.SDK.

I need to upgrade this because I was getting the application configuration version issue.

After upgrading to Azure Function Service Bus SDK, my function is no longer working and I get this error:

Microsoft.Azure.Functions.Worker.FunctionInputConverterException: Error converting 1 input parameters for Function 'Function1': Cannot convert input parameter 'myQueueItem' to type 'System.String[]' from type 'System.String'.

Would anyone please look into it and help me solving this problem?

Thank you for your time

Rushi

My code - MyFunction.csproj:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net6.0</TargetFramework>
    <AzureFunctionsVersion>v4</AzureFunctionsVersion>
    <OutputType>Exe</OutputType>    
  </PropertyGroup>
  <ItemGroup>
        <PackageReference Include="Microsoft.ApplicationInsights" Version="2.21.0" />
    <PackageReference Include="Microsoft.Azure.AppConfiguration.AspNetCore" Version="6.1.0" />
    <PackageReference Include="Microsoft.Azure.Functions.Extensions" Version="1.1.0" />
    <PackageReference Include="Microsoft.Azure.ServiceBus" Version="5.2.0" />
    <PackageReference Include="Microsoft.Dynamics.Sdk.Messages" Version="0.5.17" />
    <PackageReference Include="Microsoft.Extensions.Configuration.AzureAppConfiguration" Version="6.1.0" />
    <PackageReference Include="Microsoft.Azure.Functions.Worker" Version="1.19.0" />
    <PackageReference Include="Microsoft.Azure.Functions.Worker.Extensions.ServiceBus" Version="5.14.1" />
    <PackageReference Include="Microsoft.Azure.Functions.Worker.Sdk" Version="1.15.1" />
  </ItemGroup>
  <ItemGroup>
    <None Update="host.json">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </None>
    <None Update="local.settings.json">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
      <CopyToPublishDirectory>Never</CopyToPublishDirectory>
    </None>
  </ItemGroup>
</Project>

My Program.cs file:

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;

namespace CFX.Alerts.SBProcessor
{
    public class Program
    {
        public static void Main()
        {
            var host = new HostBuilder()
                .ConfigureFunctionsWorkerDefaults()
                .ConfigureServices((hostContext, services) =>
                {
                    var serviceProvider = services.BuildServiceProvider();
                    var logger = serviceProvider.GetService<ILogger<Function1>>();
                    services.AddSingleton(typeof(ILogger), logger);
                })
                .Build();

            host.Run();
        }
    }
}

My function.cs file:

using Microsoft.Azure.Functions.Worker;
using Microsoft.Extensions.Logging;

namespace CFX.Alerts.SBProcessor
{
    public class Function1
    {
        [Function("Function1")]
        public void Run([ServiceBusTrigger("customer.dev", Connection = "AzureWebJobsServiceBus")] 
        string[] myQueueItem, ServiceBusMessageActions messageActions, ILogger log)
        {
            log.LogInformation($"C# ServiceBus queue trigger function processed message: {myQueueItem}");
        }
    }
}

I am getting this error:

enter image description here

I tried various ways, removing and ensure to have the latest packages.

I followed these articles:


Solution

  • You're missing IsBatched on your trigger. Also, if you're planning on using ServiceBusMessageActions you'll need to receive messages as ServiceBusReceivedMessage[].

    [Function(nameof(ServiceBusReceivedMessageBatchFunction))]
    public void ServiceBusReceivedMessageBatchFunction(
        [ServiceBusTrigger("queue", Connection = "ServiceBusConnection", IsBatched = true)] ServiceBusReceivedMessage[] messages)
    {
        foreach (ServiceBusReceivedMessage message in messages)
        {
            _logger.LogInformation("Message ID: {id}", message.MessageId);
            _logger.LogInformation("Message Body: {body}", message.Body);
            _logger.LogInformation("Message Content-Type: {contentType}", message.ContentType);
        }
    }