。net核心Azure Web作业中的带有ServiceBusTrigger参数的内部函数中的DI无法绑定服务实现

问题描述 投票:0回答:1

我有一个.net核心控制台应用程序,我打算将其部署为Azure Web作业。作业的目的是在Azure Service Bus队列中侦听新消息。我已经使用包含[ServiceBusTrigger]属性的函数设置了侦听器。我构建了一个虚拟的实现,该实现只从队列中读取最新消息-可以正常工作,而不会出现问题-消息已从服务总线队列正确传递给我的函数。

当我尝试进入下一个级别并将接口参数添加到要由DI注入的函数中时,出现错误。

Microsoft.Azure.WebJobs.Host.Indexers.FunctionIndexingException:错误索引方法'Functions.ProcessMeasurementData'InvalidOperationException:无法将参数“ service”绑定到类型IProcessMeasurementService。确保支持参数类型通过绑定。如果您使用的是绑定扩展(例如,Azure存储,ServiceBus,计时器等),请确保已将您的启动代码中扩展名的注册方法(例如builder.AddAzureStorage(),builder.AddServiceBus(),builder.AddTimers()等。)>

这是我的职责。如果我删除参数IProcessMeasurementService服务,它将无法从Visual Studio 2019在本地运行(我尚未尝试将其作为WebJob部署到Azure),在将新项目添加到Azure Service Bus队列中时将它们拾取。

public class Functions
{
    public static async Task ProcessMeasurementData(
        [ServiceBusTrigger("process-measurement-data-queue", Connection = "AzureWebJobsServiceBus")] Message message,
    IProcessMeasurementService service)
    {
        try
        {

            var measurements = JsonConvert
                .DeserializeObject<List<CreateMeasurementInput>>
                    (Encoding.UTF8.GetString(message.Body));

            await service.DoStuff(measurements);

            // log.LogInformation(message.ContentType);
        }
        catch (Exception e)
        {

            throw;
        }
    }

我认为我正在正确注册服务,如下所示:

            {
                // Register application services
                services.AddSingleton<IProcessMeasurementService, ProcessMeasurementService>();
            });

这是我的主要功能。

        static void Main(string[] args)
    {
        var builder = new HostBuilder();

        builder.ConfigureAppConfiguration((builder) =>
        {
            builder

                .AddJsonFile("appsettings.json", false, true)
                .AddEnvironmentVariables();
        });


        builder.ConfigureWebJobs(b =>
        {
            b.AddServiceBus(x =>
            {
                x.MessageHandlerOptions = new MessageHandlerOptions(ExceptionReceivedHandler)
                {
                    AutoComplete = false
                };
            });

            b.AddAzureStorageCoreServices();
        });

        builder.ConfigureServices(services =>
        {
            services.AddOptions();

            // Register application services
            services.AddSingleton<IProcessMeasurementService, ProcessMeasurementService>();
        });

        var host = builder.Build();

        using (host)
        {
            host.Run();
        }
    }

从谷歌搜索看来,问题可能出在我的nuget软件包版本上。我尝试添加一个名为“ host.json”的文件,以防天蓝色函数版本与扩展库冲突的已知问题。但是它什么也没做。我实际上并没有使用AzureFunctions(我指的是无服务器功能),但是在此阶段我正在抓紧稻草。

有人知道这是什么问题吗?

这是host.json,以防万一这是问题。

{
  "version": "2.0",
  "extensionBundle": {
    "id": "Microsoft.Azure.Functions.ExtensionBundle",
    "version": "[1.*, 2.0.0)"
  }
}

这里是我安装的nuget版本

<PackageReference Include="Microsoft.Azure.ServiceBus" Version="4.1.2" />
<PackageReference Include="Microsoft.Azure.WebJobs" Version="3.0.16" />
<PackageReference Include="Microsoft.Azure.WebJobs.Extensions.ServiceBus" Version="4.1.1" />
<PackageReference Include="Microsoft.Azure.WebJobs.Sources" Version="3.0.16" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="2.2.0" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="2.2.0" />

我有一个.net核心控制台应用程序,我打算将其部署为Azure Web作业。作业的目的是在Azure Service Bus队列中侦听新消息。我已经使用...

.net-core dependency-injection azureservicebus azure-webjobs azure-servicebus-queues
1个回答
1
投票

从静态函数方法更改为实例成员,并通过构造函数注入将服务直接注入到函数类中。

© www.soinside.com 2019 - 2024. All rights reserved.