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, чтобы вступили в силу.