Триггер очереди Azure с настраиваемым именем подключения

У меня есть приложение функций 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» — все равно безуспешно.

Итак, я хотел бы знать: как я могу объявить триггер очереди, подключенный к учетной записи внешнего хранилища, с условием, что я могу получить строку подключения только во время выполнения? Заранее спасибо!

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

к моменту запуска кода в 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.

Infarch 12.08.2024 08:46

Другие вопросы по теме

Триггер нескольких репозиториев Azure. Почему он срабатывает несколько раз для одной и той же фиксации?
Невозможно воспроизвести приложение на основе холста после его импорта в другую среду/другой клиент (с использованием инструментов сборки Azure DevOps PP)
Azure Pipeline не удается извлечь подмодуль
Подключение к служебной шине из стандартного рабочего процесса приложения логики в сравнении с кодом
Правило оповещения Azure: прыгающее окно (запускать каждые n часов, запрашивать данные за последние n+m часов)
Получить за один вызов всех пользователей в группе, а также количество групп, к которым принадлежит каждый пользователь?
Есть ли способ включить пути к разделам пути к файлу в виде столбца в Azure Synapse SQL?
Как правильно зарегистрировать и запустить процессор служебной шины Azure в службе приложений Azure
Приложение nodejs/ts в службе приложений Azure продолжает закрываться после запуска
Как асинхронно отслеживать операцию покупки номера телефона Azure Communication Services с помощью пакета SDK Azure.Communication.PhoneNumbers?

Похожие вопросы

Ошибка «Невозможно неявно преобразовать тип» только в том случае, если универсальный экземпляр создается с помощью интерфейса
Как воспроизвести поведение сопоставления шаблонов в операторе переключения C# 4? Функция «сопоставление шаблонов» недоступна в C# 4
Игнорировать всю строку, если преобразование не удалось
Есть ли способ получить сложный объект из строки запроса в ASP.NET Core 8?
Имитация менеджера пользователей с использованием модульного теста ASP.NET Core
EF Core — невозможно выполнить агрегатную функцию для выражения, содержащего агрегат или подзапрос
Почему обязательные поля не учитываются в моей схеме JSON?
Числа, встречающиеся дважды в одном и том же столбце и строке в программе доски судоку
Можно ли использовать выражение LINQ с подписью делегата для получения параметров?
Строки, допускающие значение NULL, и другие ссылочные типы в C# 12