У меня есть приложение функций Azure (.net8, изолированная модель). Существует триггер очереди, который довольно хорошо работает с внутренним хранилищем приложений. Это выглядит так:
[Function(nameof(InnerStorageTrigger))]
public void InnerStorageTrigger([QueueTrigger("test-queue-inner")] QueueMessage message)
{
_logger.LogInformation($"Inner message: {message.MessageText}");
}
Но мне также нужен еще один триггер, подключенный к другой учетной записи хранения. Я знаю, что могу сохранить дополнительную строку подключения в настройках приложения (либо local.settings.json, либо конфигурации приложения в Azure). Но, к сожалению, строка подключения поступает из внешнего источника, и я могу получить к ней доступ только в Program.cs. Я попытался установить переменную среды перед инициализацией хоста:
Environment.SetEnvironmentVariable("MyConnection", GetExternalConnectionString());
var host = new HostBuilder()
.ConfigureFunctionsWebApplication()
.ConfigureServices(services =>
{
services.AddApplicationInsightsTelemetryWorkerService();
services.ConfigureFunctionsApplicationInsights();
})
.ConfigureAppConfiguration((context, config) =>
{
config.AddEnvironmentVariables();
})
.Build();
host.Run();
Вторая триггерная функция:
[Function(nameof(TestQueueOuter))]
public void Run([QueueTrigger("test-queue", Connection = "MyConnection")] QueueMessage message)
{
_logger.LogInformation($"From outer: {message.MessageText}");
}
Это не работает. Я получаю сообщение об ошибке: «Функция TestQueueOuter имеет ошибку: Microsoft.Azure.WebJobs.Host: ошибка метода индексирования Functions.TestQueueOuter». Microsoft.Azure.WebJobs.Extensions.Storage.Queues: строка подключения учетной записи хранения «AzureWebJobsMyConnection» не существует. Убедитесь, что это определенный параметр приложения.». Я также попытался явно назвать переменную среды «AzureWebJobsMyConnection» — все равно безуспешно.
Итак, я хотел бы знать: как я могу объявить триггер очереди, подключенный к учетной записи внешнего хранилища, с условием, что я могу получить строку подключения только во время выполнения? Заранее спасибо!





к моменту запуска кода в Program.cs триггеры уже проиндексированы. QueueTrigger уже пытался бы разрешить строку подключения из конфигурации, но, поскольку она еще не доступна, она выдает ошибку. Я думаю, вам нужно будет использовать Azure SDK напрямую.
Но мне также нужен еще один триггер, подключенный к другой учетной записи хранения. Я знаю, что могу сохранить дополнительную строку подключения в настройках приложения (либо local.settings.json, либо конфигурации приложения в Azure).
Я согласен с @Artur Adam. Чтобы добавить еще одну строку подключения, вы можете просто добавить в local.settings.json, как показано ниже:
{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "UseDevelopmentStorage=true",
"FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated",
"rithcon": "DefaultEndpointsProtocol=https;AccountName=rithwikb39a;AccountKey=XZlFEc82NWd0N+AStRDKM3w==;EndpointSuffix=core.windows.net",
"rithtest": "DefaultEndpointsProtocol=https;AccountName=rithwika043;AccountKey=W1+dvK7ab+AStxb4Huw==;EndpointSuffix=core.windows.net"
}
}
Функция.cs:
using System;
using Azure.Storage.Queues.Models;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Extensions.Logging;
namespace FunctionApp213
{
public class Function1
{
private readonly ILogger<Function1> ri_lg;
public Function1(ILogger<Function1> logger)
{
ri_lg = logger;
}
[Function(nameof(Function1))]
public void Run([QueueTrigger("rithq", Connection = "rithcon")] QueueMessage message)
{
ri_lg.LogInformation($"Queue trigger from queue 1, Msg is : {message.MessageText}");
}
}
public class Function2
{
private readonly ILogger<Function2> ri_lg;
public Function2(ILogger<Function2> logger)
{
ri_lg = logger;
}
[Function(nameof(Function2))]
public void Run([QueueTrigger("rithq2", Connection = "rithtest")] QueueMessage message)
{
ri_lg.LogInformation($"Queue trigger from queue 2, Msg is: {message.MessageText}");
}
}
}
Выход:

Если вам это не помогло, используйте SDK для вызова очереди и выполнения других функций.
Конечно, у меня может быть много строк подключения в настройках приложения. Но я намеревался получить и установить CS во время выполнения, в Program.cs.