Webjobs方法索引-依赖注入异常IConfiguration

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

。NET Core 2.2,WebJobs SDK v3.0

我这样初始化主机

        HostBuilder builder = new HostBuilder();
        builder.ConfigureAppConfiguration((context, configApp) => {
            configApp.AddJsonFile("appsettings.json", optional: true);
            configApp.AddJsonFile(
               $"appsettings.{context.HostingEnvironment.EnvironmentName}.json",
               optional: true);
        });

        builder.ConfigureWebJobs((context, configure) => {
            configure.AddAzureStorage();
            configure.Services.AddSingleton(context.Configuration);
        });

        builder.ConfigureServices((context, services) => {
            services.AddSingleton(context.Configuration);
        });

我的用于处理队列中消息的webJob函数如下所示:

public static void ProcessQueueMessage([QueueTrigger("queuename")] CloudQueueMessage queueMessage, 
  TextWriter log, IConfiguration configuration)

当我的主持人开始我得到一个例外

Microsoft.Azure.WebJobs.Host.Indexers.FunctionIndexingException: 'Error indexing method 'Functions.ProcessQueueMessage''

InvalidOperationException: Cannot bind parameter 'configuration' to type IConfiguration. Make sure the parameter Type is supported by the binding. If you're using binding extensions (e.g. Azure Storage, ServiceBus, Timers, etc.) make sure you've called the registration method for the extension(s) in your startup code (e.g. builder.AddAzureStorage(), builder.AddServiceBus(), builder.AddTimers(), etc.).

我在做什么错?

azure azure-webjobs azure-webjobssdk
2个回答
0
投票

首先,您在configure.AddAzureStorageCoreServices();方法中缺少一行代码this article(有关其详细信息,请参考builder.ConfigureWebJobs。)。

[根据我的经验(我想您想使用parameter DI从配置文件中读取),IConfiguration似乎不支持parameter DI以及constructor DI(我为此找不到任何文档,但是我们之前在webjobs v2和v3中都尝试过这些DI,但找不到解决方案。)。]

所以我们当前的解决方案不使用DI,而是直接从配置文件中读取设置。这是我们这边的代码:

在Functions.cs中:

public class Functions
{
    public void ProcessQueueMessage([QueueTrigger("queue")] string message, ILogger logger)
    {
        logger.LogInformation(message);

        IConfigurationRoot configurationRoot = BuildConfiguration();
        logger.LogInformation("this is a value: " + configurationRoot["mySettings"]);
    }

    private static IConfigurationRoot BuildConfiguration()
    {
        var builder = new ConfigurationBuilder()
             .SetBasePath(Directory.GetCurrentDirectory())
             .AddJsonFile("appsettings.json");

        IConfigurationRoot configurationRoot = builder.Build();
        return configurationRoot;
    }

}
    

0
投票

代替使用静态函数和参数注入,可以使用完整的类和构造函数注入。

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