azure webjob: прочитайте appSettings.json и введите конфигурацию в TimerTrigger - PullRequest
0 голосов
/ 12 января 2019

У меня проблемы с чтением значений конфигурации из файла appSettings.json в webjob. Webjob использует следующие пакеты nuget:

enter image description here

В моем консольном приложении (webjob) у меня есть два файла настроек: appsettings.development.json appsettings.production.json

В методе Main веб-работа настраивается следующим образом:

 static void Main(string[] args)
    {
        var builder = new HostBuilder()
                .ConfigureWebJobs(webJobConfiguration =>
                {
                    webJobConfiguration.AddTimers();
                    webJobConfiguration.AddAzureStorageCoreServices();  
                })
                .ConfigureAppConfiguration((hostingContext, config) =>
                 {
                     var env = hostingContext.HostingEnvironment;
                     Console.WriteLine("hostingContext.HostingEnvironment: " + env.EnvironmentName);
                     config.SetBasePath(Directory.GetCurrentDirectory())
                     .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: false, reloadOnChange: true)
                     .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: false, reloadOnChange: true)
                     .AddEnvironmentVariables().Build();
                 })
                .ConfigureServices((context, serviceCollection) =>
                {
                    serviceCollection.AddSingleton<IConfiguration>(context.Configuration);
                    serviceCollection.AddTransient<SayHelloWebJob>(job => new SayHelloWebJob(context.Configuration));
                })
                .Build();

        builder.Run();
    }

Код для SayHelloWebJob приведен ниже:

public class SayHelloWebJob
{
     static IConfiguration _configuration;
    public SayHelloWebJob(IConfiguration config)
    {
        _configuration = config;
        Console.WriteLine("Initialized SayHelloWebJob");
    }

    [Singleton]
    public static void TimerTick([TimerTrigger("0 */1 * * * *")]TimerInfo myTimer)
    {
        Console.WriteLine($"From SayHelloWebJob: Hello at {DateTime.UtcNow.ToString()}");
        var test = _configuration.GetSection("WebJobConfiguration:message").Value;
        Console.WriteLine("Configuration access: message: " + test);
        Console.WriteLine("Configuration access: " + _configuration.GetSection("WebJobConfiguration:api").Value);
        Console.WriteLine("configuration object: "+ _configuration.GetConnectionString("AzureWebJobsStorage"));

    }
}

Когда я запускаю свое веб-задание, я вижу, что журналы console.writeline никогда не выводят конфигурации, которые я пытаюсь прочитать в методе TimerTick.

Вопросы:

  1. Как добавить конфигурацию appSettings в метод TimerTick?
  2. У меня есть два файла appSettings - для разработки и производства. Как я могу убедиться, что во время производства загружается правильный файл?

Пример файла appSettings.development.json ниже:

{
"connectionStrings": {
    "AzureWebJobsStorage": stringhere",
    "AzureWebJobsDashboard": "stringhere"
},
"WebJobConfiguration": {
    "message": "I'm running locally!",
    "pfuWebApiUrl": "API link here",
    "api": "api here",
    "ApplicationInsights": {
        "InstrumentationKey": "key here"
    }
}

}

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Я использовал Json.NET для чтения файла json.

Это мой JSON-контент:

{

«объект»: {

"name": "cwr"

},

"другие": "123"

}

А это код function.cs:

 public static void Run([TimerTrigger("0 */1 * * * *")] TimerInfo timer,
        ILogger logger)
    {

        JObject jsonData = JObject.Parse(File.ReadAllText(path));

        logger.LogInformation(jsonData["object"]["name"].ToString());
        logger.LogInformation(jsonData["others"].ToString());

    }

А вот и вывод:

enter image description here

Надеюсь, это поможет вам, если у вас остались другие вопросы, пожалуйста, дайте мне знать.

0 голосов
/ 14 января 2019

Я предпочитаю, чтобы все настройки среды были зарегистрированы как есть, и определенно возможно загрузить правильный файл во время выполнения в зависимости от среды.

Сначала установите ваши конфигурационные файлы на «копировать в выходной каталог в более новом» на панели «Свойства» в Visual Studio или добавьте это в ваш csproj:

    <None Update="base.settings.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
    </None>
    <None Update="prod.settings.json">
      <CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
    </None>

Теперь вам просто нужно загрузить правильную конфигурацию во время выполнения.

        private static IConfigurationRoot GetConfiguration(string basePath)
        {
            string filename = Constants.IsAzureEnvironment ? "prod.settings.json" : "dev.settings.json";

            IConfigurationBuilder configBuilder = new ConfigurationBuilder()
                .SetBasePath(basePath)
                .AddJsonFile("base.settings.json")
                .AddJsonFile(filename);

            return configBuilder.Build();
        }

Я получаю basePath из параметра executeContext функции azure

        [FunctionName("Function1")]
        public static async Task<IActionResult> RunAsync([HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req, ILogger log, Microsoft.Azure.WebJobs.ExecutionContext context)
        {
            // context.FunctionAppDirectory
            return new OkResult();
        }
...