我正在.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() 等)。
除了上面代码中显示的内容之外,我还尝试使用ConfigurationManager
and 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)