Как получить FunctionAppDirectory в Configure (построитель IWebJobsBuilder) в функции Azure - PullRequest
0 голосов
/ 24 апреля 2019

В функции Azure я могу получить FunctionAppDirectory из контекста, но как получить FunctionAppDirectory в методе Configure.

Мне нужен FunctionAppDirectory на <<FunctionAppDirectory>> в коде:

// --------------------------------------------------------------------------------------------------------------------
// <copyright file="WebJobsExtensionStartup.cs" company="Microsoft">
// Copyright (c) Microsoft Corporation. All rights reserved.
// </copyright>
//  --------------------------------------------------------------------------------------------------------------------

using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
using Intercom.Helpers;
using Microsoft.ApplicationInsights.Extensibility;
using Microsoft.Azure.KeyVault;
using Microsoft.Azure.Services.AppAuthentication;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Configuration.AzureKeyVault;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;

[assembly: WebJobsStartup(typeof(ConvAi.BfChannel.BotManagementService.WebJobsExtensionStartup), "Web Jobs Extension")]
namespace ConvAi.BfChannel.BotManagementService
{
    /// <summary>
    /// WebJobsExtensionStartup
    /// So this Azure function should be deployed with App service plan.
    /// </summary>
    public class WebJobsExtensionStartup : IWebJobsStartup
    {
        /// <summary>
        /// AzureServiceTokenProvider which is used for requesting identity token.
        /// </summary>
        public static AzureServiceTokenProvider AzureServiceTokenProvider { get; set; }

        /// <summary>
        /// Configure services.
        /// </summary>
        /// <param name="builder">WebJob Builder</param>
        public void Configure(IWebJobsBuilder builder)
        {
            try
            {
                bool isLocal = string.IsNullOrEmpty(Environment.GetEnvironmentVariable("WEBSITE_INSTANCE_ID"));

                // Gets the default configuration
                var serviceConfig = builder.Services.FirstOrDefault(s => s.ServiceType.Equals(typeof(IConfiguration)));
                var rootConfig = (IConfiguration)serviceConfig.ImplementationInstance;


                var config = new ConfigurationBuilder()
                    .SetBasePath(<<FunctionAppDirectory>>)
                    .AddConfiguration(rootConfig)
                    .AddJsonFile($@"Config\botregistrationOptions.{rootConfig["environmentName"]}.json", optional: false)
                    .Build();

                // Replace the existing config
                builder.Services.AddSingleton<IConfiguration>(config);

            }
            catch (Exception ex)
            {
                //log
                throw;
            }
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 25 апреля 2019

См. Здесь хорошее объяснение того, как обрабатывать настройки приложения в функциях v2: https://blog.jongallant.com/2018/01/azure-function-config/

Итог: для локальной отладки вы обычно используете файл local.settings.json. При развертывании в Azure вы не используете файлы конфигурации, а вместо этого параметры приложения внедряются как переменные среды в вашу функцию. Одним из огромных преимуществ этого является то, что вы можете использовать такие вещи, как интеграция Azure Key Vault для безопасного хранения настроек: https://docs.microsoft.com/en-us/azure/app-service/app-service-key-vault-references

0 голосов
/ 25 апреля 2019

Вы можете заменить context.FunctionAppDirectory на Environment.CurrentDirectory.

По крайней мере, это работает локально, и именно там вам нужно local.settings.json для работы, поэтому это изменение должно быть безопасным.

Когда вы будете использовать его на Azure, вам нужно добавить .AddEnvironmentVariables() к config.

Обновление:

Используйте следующий код, когда вы работаете как локально, так и на Azure.

var config = new ConfigurationBuilder()
    .SetBasePath(<<FunctionAppDirectory>>)
    .AddConfiguration(rootConfig)
    .AddJsonFile($@"Config\botregistrationOptions.{rootConfig["environmentName"]}.json", optional: false)
    .AddEnvironmentVariables()
    .Build();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...