Azure WebJobs QueueTrigger игнорирует среду при чтении конфигурации

У меня есть веб-задания Azure с QueueTrigger:

public void ProcessTestQueueByTrigger(
    [QueueTrigger("test-queue", Connection = "MyCustomStorageConnection")] string queueMessage,
    int dequeueCount,
    TextWriter log)
    {
        var message = $"ProcessTestQueueByTrigger executed: {queueMessage}, dequeue: {dequeueCount}";
        log.WriteLine(message);
    }
}

куда MyCustomStorageConnection- это не то же самое, что соединение заданий по умолчанию (поэтому я определяю его в атрибуте QueueTrigger). У меня также есть два локальных файла, которые определяют настройки для среды dev и prod:appsettings.json а также appsettings.Production.json.

Когда я запускаю веб-задания, я читаю действительную конфигурацию и настройки в config объект

var configuration = new JobHostConfiguration
{
    DashboardConnectionString = config.GetConnectionString("AzureWebJobsDashboard"),
    StorageConnectionString = config.GetConnectionString("AzureWebJobsStorage"),
};

и действительное соединение, хранящееся в config.GetConnectionString("MyCustomStorageConnection")а вот ставить с хоста негде. И всякий раз, когда хост запускается,QueueTrigger читает значение из appsettings.json и полностью игнорирует appsettings.Production.json.

Как я могу заставить QueueTrigger использовать правильную конфигурацию или просто определить значение для строки подключения QueueTrigger?

1 ответ

Вы можете легко добиться этого, установив переменную среды.

Ниже приведены шаги для Windows 10 с Visual Studio 2017.

1. Создайте базовую веб-задачу.NET (вы можете следовать этому документу, если не знакомы) и завершенный код, как показано ниже:

Program.cs:

using System;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;

namespace MySampleWebjob
{
    class Program
    {
        static void Main(string[] args)
        {

            //since we have 2 .json files, we can control which .json file is to be used by setting a Environment variable. And then read the value here.
            var environment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
            Console.WriteLine($"the environment is: "+ environment);

            var builder = new HostBuilder();
            builder.ConfigureWebJobs(b =>
            {
                b.AddAzureStorageCoreServices();
                b.AddAzureStorage();
            })
            .ConfigureAppConfiguration((hostContext, configApp) => {
                configApp.AddJsonFile("appsettings.json", optional: true,reloadOnChange:true);
                configApp.AddJsonFile($"appsettings.{environment}.json", optional: true, reloadOnChange: true);
                configApp.AddEnvironmentVariables();
            })
            .ConfigureLogging((context, b) =>
            {
                b.AddConsole();
            })
            ;
            var host = builder.Build();
            using (host)
            {
                host.Run();
            }
        }
    }
}

Functions.cs:

using Microsoft.Azure.WebJobs;
using Microsoft.Extensions.Logging;

namespace MySampleWebjob
{
        public class Functions
        {
            public static void ProcessQueueMessage([QueueTrigger("myqueue-items")] string message, ILogger logger)
            {
                logger.LogInformation(message);
            }
        }    
}

Затем добавьте в проект 2 файла.json:appsettings.Production.json а также appsettings.json. Структура двух файлов.json одинакова, но имеют разные строки подключения к хранилищу.

appsettings.json:

{
  "AzureWebJobsStorage": "DefaultEndpointsProtocol=https;AccountName=xxx;AccountKey=xx;EndpointSuffix=core.windows.net"
}

appsettings.Production.json:

  {
      "AzureWebJobsStorage": "Another azure storage connection string"
    }

Обратите внимание, что в Visual Studio щелкните правой кнопкой мыши каждый файл json -> свойства -> установите для параметра "Копировать в выходной каталог" значение "Копировать, если новее".

Наконец, установите переменную среды через cmd или пользовательский интерфейс. Команда cmdsetx ASPNETCORE_ENVIRONMENT "Production", а затем перезапустите визуальную студию, если вы хотите использовать переменную среды.

Итак, если вы хотите использовать строку подключения к хранилищу из appsettings.json, не нужно устанавливать переменную среды. Если вы хотите использовать строку подключения изappsettings.Production.json, необходимо установить переменную среды.

Обратите внимание, что если вы устанавливаете переменную среды или удаляете переменную среды, не забудьте перезапустить Visual Studio, чтобы вступили в силу.

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