0

我正在.net core 3.1 中创建一个网络作业。在这个项目中,我有一个定时器激活的函数,它应该读取队列 Q1 中的消息数量,如果为空,则将消息放入 Q2 并触发对 API 的休息调用。

为了检查 API 中有多少消息,我需要访问AzureWebJobsStorage我的 appsettings.json 中的 ,然后访问设置中的 url。

程序.cs

class Program
    {
        static async Task Main()
        {
            var builder = new HostBuilder();
            builder.ConfigureWebJobs(b =>
                {
                    b.AddAzureStorageCoreServices();
                    b.AddAzureStorage();
                    b.AddTimers();
                });
            builder.ConfigureLogging((context, b) =>
                {
                    b.AddConsole();
                });
            builder.ConfigureAppConfiguration((context, b) => 
            {
                b.SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
                .AddEnvironmentVariables();
            });
            builder.ConfigureServices((context, services) =>
            {
                var mySettings = new MySettings
                {
                    AzureWebJobsStorage = context.Configuration.GetValue<string>("AzureWebJobsStorage"),
                    AzureWebJobsDashboard = context.Configuration.GetValue<string>("AzureWebJobsDashboard"),
                    url = context.Configuration.GetValue<string>("url"),
                };
                services.AddSingleton(mySettings);
            });
            var host = builder.Build();
            using (host)
            {
                await host.RunAsync();
            }
        }
    }

函数.cs

public class Functions
    {
public static void UpdateChannels([QueueTrigger("Q1")] string message, ILogger logger)
        {
            logger.LogInformation(message);
        }

        public static void WhatIsThereToUpdate([QueueTrigger("Q2")] string message, ILogger logger)
        {
            logger.LogInformation(message);
        }

        public static void CronJob([TimerTrigger("0 * * * * *")] TimerInfo timer, [Queue("Q2")] out string message, ILogger logger, MySettings mySettings)
        {
            message = null;
            // Get the connection string from app settings
            string connectionString = mySettings.AzureWebJobsStorage;
            logger.LogInformation("Connection String: " + connectionString);
            // Instantiate a QueueClient which will be used to create and manipulate the queue
            QueueClient queueClient = new QueueClient(connectionString, "Q1");
            if (queueClient.Exists())
            {
                QueueProperties properties = queueClient.GetProperties();

                // Retrieve the cached approximate message count.
                int cachedMessagesCount = properties.ApproximateMessagesCount;

                // Display number of messages.
                logger.LogInformation($"Number of messages in queue: {cachedMessagesCount}");

                if (cachedMessagesCount == 0)
                    message = "Hello world!" + System.DateTime.Now.ToString(); //here I would call the REST API as well
            }

            logger.LogInformation("Cron job fired!");
        }
    }

应用设置.json

{
  "AzureWebJobsStorage": "constr",
  "AzureWebJobsDashboard": "constr",
  "url": "url"
}

我的设置

public class MySettings
    {
        public string AzureWebJobsStorage { get; set; }
        public string AzureWebJobsDashboard { get; set; }
        public string url { get; set; }
    }

但是,当我运行它时,我收到以下错误:

错误索引方法“Functions.CronJob”Microsoft.Azure.WebJobs.Host.Indexers.FunctionIndexingException:错误索引方法“Functions.CronJob”---> System.InvalidOperationException:无法将参数“mySettings”绑定到类型 MySettings。确保绑定支持参数类型。如果您正在使用绑定扩展(例如 Azure 存储、ServiceBus、计时器等),请确保您已在启动代码中调用了扩展的注册方法(例如 builder.AddAzureStorage()、builder.AddServiceBus( )、builder.AddTimers() 等)。

除了上面代码中显示的内容之外,我还尝试使用ConfigurationManagerand Environment.GetEnvironmentVariable,当我尝试读取值时,这两种方法都给了我 null 。例如ConfigurationManager.AppSettings.GetValues("AzureWebJobsStorage").

我还尝试注册IConfiguration为服务services.AddSingleton(context.Configuration);并将其注入参数(而不是MySettings),但它也给了我相同的绑定错误。

我真的很茫然,我搜索了 SO 档案试图找到一个解决方案,我想我尝试了我所看到的一切都给人们带来了积极的结果,但不幸的是我没有其他海报那么幸运。

非常感谢任何指导。

编辑添加我的包

如果它对任何人有帮助,我正在使用以下内容

Azure.Storage.Queues (12.4.0)

Microsoft.Azure.WebJobs.Extensions (3.0.6)

Microsoft.Azure.WebJobs.Extensions.Storage (4.0.2)

Microsoft.Extensions.Logging.Console (3.1.7)

4

1 回答 1

0

在使用 DI 时,我建议你使用非静态方法和构造函数注入。

这是 Functions.cs:

public class Functions
{
    private readonly MySettings mySettings;

    public Functions(MySettings _mySettings)
    {
        mySettings = _mySettings;
    }

    public void ProcessQueueMessage([TimerTrigger("0 */1 * * * *")] TimerInfo timer, [Queue("queue")] out string message, ILogger logger)
    {
        message = null;
        string connectionString = mySettings.AzureWebJobsStorage;
        logger.LogInformation("Connection String: " + connectionString);
    }
}

其他 .cs 文件中没有代码更改。

这是测试结果:

在此处输入图像描述

于 2020-08-18T09:27:44.877 回答