【发布时间】: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