【问题标题】:Ihostbuilder does not contain a definition for configurewebhostdefaults compile errorIhostbuilder 不包含 configurewebhostdefaults 编译错误的定义
【发布时间】:2020-07-11 19:18:59
【问题描述】:

我创建了一个 .NetCore 3.1 FunctionApp。我正在尝试在 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 读取连接字符串。部署应用程序。 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>();
        }

【问题讨论】:

  • ConfigureWebHostDefaults(webBuilder..... 这段代码是自动生成的吗?
  • 这是我在大多数链接中看到的示例代码。所以我不确定
  • 您是否在 Visual Studio 中创建空函数应用程序?你能分享你正在关注的文档吗?
  • 我使用 Visual Studio FunctionApp 模板创建了一个 FunctionApp。添加了一个启动文件。我没有看到从这种模板访问密钥库的示例。我看到的示例主要用于控制台类型的应用程序,这些应用程序具有使用 IWebHostBuilder 或 IHostbuilder 接口的 program.cs 启动文件。例如docs.microsoft.com/en-us/aspnet/core/security/…
  • 没有看到 .Net core 3.1 函数应用程序在 c# 代码中以编程方式访问 keyvault 的示例

标签: c# asp.net-core azure-functions azure-keyvault


【解决方案1】:

根据我的测试,如果你想在Azure函数中读取Azure key vault的秘密形式,请参考以下代码

  1. Save the key vault name as a variable in Azure function app settings

  2. Enable Azure MSI for Azure function

  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);
        }


        
    }

【讨论】:

  • 嗨,吉姆,非常感谢您给我一步指导。至于阅读秘密,我认为这就像写这一行一样简单 var connectionString = Environment.GetEnvironmentVariable("ConnectionString");在你的功能中。我已经更新了帖子。我所理解的是,一旦部署了应用程序,它将读取 Azure 相应处理的环境的秘密。如果我的想法正确,请告诉我,并查看我更新的帖子。
  • @Tom 如果您使用 Key Vault 引用,在我们部署后,我们可以将 Key Vault 引用读取为环境变量:docs.microsoft.com/en-us/azure/app-service/…
  • 还没有。我一试就告诉你。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-26
  • 1970-01-01
  • 1970-01-01
  • 2018-12-25
相关资源
最近更新 更多