You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Startup.cs的ConfigureServices中使用KeyVaultManager获取数据库连接串

解决方案:从Key Vault获取连接串配置DbContext

方法一:直接使用SecretClient(跳过自定义KeyVaultManager)

你的KeyVaultManager只是简单封装了SecretClient的GetSecretAsync逻辑,可直接在ConfigureServices中解析SecretClient获取连接串,减少额外依赖:

public void ConfigureServices(IServiceCollection services)
{
    services.AddAzureClients(azureClientFactoryBuilder =>
    {
        azureClientFactoryBuilder.AddSecretClient(Configuration.GetSection("KeyVault"));
    });

    // 构建临时服务提供者获取SecretClient
    var serviceProvider = services.BuildServiceProvider();
    var secretClient = serviceProvider.GetRequiredService<SecretClient>();
    
    // 同步获取密钥
    var connectionString = secretClient.GetSecret("dbConn").Value.Value;

    services.AddDbContext<IApplicationDbContext, ApplicationDbContext>(options =>
        options.UseSqlServer(connectionString,
            opts => opts.UseQuerySplittingBehavior(QuerySplittingBehavior.SplitQuery)));

    services.AddControllersWithViews();
    services.AddRazorPages();
}

方法二:使用自定义KeyVaultManager + 异步配置

如果必须保留KeyVaultManager,由于GetSecretAsync是异步方法,可改用异步版的服务配置:

public async Task ConfigureServicesAsync(IServiceCollection services)
{
    services.AddAzureClients(azureClientFactoryBuilder =>
    {
        azureClientFactoryBuilder.AddSecretClient(Configuration.GetSection("KeyVault"));
    });

    services.AddSingleton<IKeyVaultManager, KeyVaultManager>();

    // 构建临时服务提供者获取KeyVaultManager
    var serviceProvider = services.BuildServiceProvider();
    var keyVaultManager = serviceProvider.GetRequiredService<IKeyVaultManager>();
    var connectionString = await keyVaultManager.GetSecretAsync("dbConn");

    services.AddDbContext<IApplicationDbContext, ApplicationDbContext>(options =>
        options.UseSqlServer(connectionString,
            opts => opts.UseQuerySplittingBehavior(QuerySplittingBehavior.SplitQuery)));

    services.AddControllersWithViews();
    services.AddRazorPages();
}

注意:使用ConfigureServicesAsync需要修改Program.cs启动逻辑,将同步配置替换为异步调用(.NET 6+支持异步启动)。

方法三:DbContext异步工厂(更优雅的实现)

无需提前构建临时ServiceProvider,直接在DbContext初始化时动态获取密钥:

public void ConfigureServices(IServiceCollection services)
{
    services.AddAzureClients(azureClientFactoryBuilder =>
    {
        azureClientFactoryBuilder.AddSecretClient(Configuration.GetSection("KeyVault"));
    });

    services.AddSingleton<IKeyVaultManager, KeyVaultManager>();

    // 使用DbContext工厂异步获取连接串
    services.AddDbContextFactory<IApplicationDbContext, ApplicationDbContext>(async (serviceProvider, options) =>
    {
        var keyVaultManager = serviceProvider.GetRequiredService<IKeyVaultManager>();
        var connectionString = await keyVaultManager.GetSecretAsync("dbConn");
        
        options.UseSqlServer(connectionString,
            opts => opts.UseQuerySplittingBehavior(QuerySplittingBehavior.SplitQuery));
    });

    services.AddControllersWithViews();
    services.AddRazorPages();
}

注意事项

  • 临时构建ServiceProvider可能会生成单例实例的副本,对生命周期有严格要求的场景优先选择方法三。
  • 确保应用服务主体拥有Key Vault的Secret Get权限,避免访问失败。

内容的提问来源于stack exchange,提问作者Daniel Björk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 19:54:24