Ihostbuilder не содержит определения ошибки компиляции configurewebhostdefaults - PullRequest
0 голосов
/ 11 июля 2020

Я создал приложение FunctionApp .NetCore 3.1. Я пытаюсь реализовать код в файле startup.cs для доступа к Azure KeyVault. Мне нужно руководство, чего я не делал раньше. Пока мне удалось получить следующий код из документации, но не знаю, как его использовать. Я также получаю ошибку времени компиляции, в которой говорится, что ihostbuilder не содержит определения для configurewebhostdefaults в строке

 .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });

Я не уверен, почему я получаю эту ошибку и как вызвать этот метод

startup.cs

[assembly: FunctionsStartup(typeof(Startup))]
namespace SRL.CustomerOrder
{
    internal class Startup : FunctionsStartup
    {
        public override void Configure(IFunctionsHostBuilder builder)
        {
            builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies());
            builder.Services.AddScoped<ISrlContext, CustomerManagerContext>();
            builder.Services.AddAutoMapper(typeof(Startup));

           
            builder.Services.AddDbContext<CustomerManagerContext>(options =>
               options.UseSqlServer(Environment.GetEnvironmentVariable(EnviornmentVariables.SrlContext)));

            builder.Services.AddTransient<ICustomerDetailsRepository, CustomerDetailsRepository>();
            builder.Services.AddTransient<ICustomerOrdersRepository, CustomerOrdersRepository>();
            builder.Services.AddTransient<IOrderDetailsRepository, OrderDetailsRepository>();

            
            //?? throw new InvalidOperationException()).EnableSensitiveDataLogging());
        }

       

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureAppConfiguration((context, config) =>
                {
                    if (context.HostingEnvironment.IsProduction())
                    {
                        var builtConfig = config.Build();

                        AzureServiceTokenProvider azureServiceTokenProvider = new AzureServiceTokenProvider();
                        var keyVaultClient = new KeyVaultClient(
                            new KeyVaultClient.AuthenticationCallback(
                                azureServiceTokenProvider.KeyVaultTokenCallback));

                        config.AddAzureKeyVault(
                            $"https://{builtConfig["KeyVaultName"]}.vault.azure.net/",
                            keyVaultClient,
                            new DefaultKeyVaultSecretManager());
                    }
                })
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });
    }
}

Предлагаемое решение

Считайте строку подключения из local.settings. json с помощью переменной enviornment. Разверните приложение. Azure заботится о восстановлении соответствующего секрета этой среды

public override void Configure(IFunctionsHostBuilder builder)
        {
            var connectionString = Environment.GetEnvironmentVariable("ConnectionString");

            builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies());
            builder.Services.AddScoped<ISrlContext, CustomerManagerContext>();
            builder.Services.AddAutoMapper(typeof(Startup));

            builder.Services.AddDbContext<CustomerManagerContext>(options =>
               options.UseSqlServer(connectionString));

            builder.Services.AddTransient<ICustomerDetailsRepository, CustomerDetailsRepository>();
            builder.Services.AddTransient<ICustomerOrdersRepository, CustomerOrdersRepository>();
            builder.Services.AddTransient<IOrderDetailsRepository, OrderDetailsRepository>();
        }

1 Ответ

0 голосов
/ 13 июля 2020

Согласно моему тесту, если вы хотите прочитать секретную форму Azure хранилище ключей в функции Azure, обратитесь к следующему коду

  1. Сохраните имя хранилища ключей как переменная в Azure настройках приложения-функции

  2. Включить Azure MSI для Azure функции

  3. Настроить политику доступа для MSI

  4. Код

 public static class Http
    {
        private static IConfiguration Configuration;

        static Http()
        {
            AzureServiceTokenProvider azureServiceTokenProvider = new AzureServiceTokenProvider();
            var keyVaultClient = new KeyVaultClient(
                new KeyVaultClient.AuthenticationCallback(
                    azureServiceTokenProvider.KeyVaultTokenCallback));
            Configuration = new ConfigurationBuilder()
                   .AddAzureKeyVault(string.Format("https://{0}.vault.azure.net/", Environment.GetEnvironmentVariable("keyVaultName")), 
                                   keyVaultClient,
                                   new DefaultKeyVaultSecretManager())
                   .Build();

        }

        [FunctionName("Http")]
        public static async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
            ILogger log)
        {

           
            log.LogInformation("C# HTTP trigger function processed a request.");
            var f1= Configuration["DBConnectionString"];
            return new OkObjectResult("the DBConnectionString :" + f1);
        }


        
    }

введите описание изображения здесь

...