Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Azure KeyVault for DBContext:“;没有为此DbContext配置数据库提供程序;_C#_Azure_Entity Framework Core_Azure Keyvault - Fatal编程技术网

C# Azure KeyVault for DBContext:“;没有为此DbContext配置数据库提供程序;

C# Azure KeyVault for DBContext:“;没有为此DbContext配置数据库提供程序;,c#,azure,entity-framework-core,azure-keyvault,C#,Azure,Entity Framework Core,Azure Keyvault,我正在使用.NETCore2.1构建一个Web API。这将作为Azure Web应用程序托管。我想将数据库连接字符串保留在Azure密钥库中。这是我在Startup.cs ConfigureServices方法中输入的代码: services.AddDbContext<dbContext>(async options => { var keyVaultUri = new Uri("https://xxxxxxxxx.vault.azu

我正在使用.NETCore2.1构建一个Web API。这将作为Azure Web应用程序托管。我想将数据库连接字符串保留在Azure密钥库中。这是我在Startup.cs ConfigureServices方法中输入的代码:

services.AddDbContext<dbContext>(async options => 
        {
            var keyVaultUri = new Uri("https://xxxxxxxxx.vault.azure.net/");
            var azureServiceTokenProvider = new AzureServiceTokenProvider();
            var keyVaultClient = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(azureServiceTokenProvider.KeyVaultTokenCallback));
            SecretBundle connectionStringSecret = await keyVaultClient.GetSecretAsync(keyVaultUri + "secrets/DBConnectionString");
            options.UseSqlServer(connectionStringSecret.Value);
        });
services.AddDbContext(异步选项=>
{
var keyVaultUri=新Uri(“https://xxxxxxxxx.vault.azure.net/");
var azureServiceTokenProvider=新azureServiceTokenProvider();
var keyVaultClient=newkeyvaultclient(newkeyvaultclient.AuthenticationCallback(azureservicetokeprovider.KeyVaultTokenCallback));
SecretBundle connectionStringSecret=wait keyVaultClient.GetSecretAsync(keyVaultUri+“secrets/DBConnectionString”);
options.UseSqlServer(connectionStringSecret.Value);
});
当我尝试使HTTP Get访问已注入dbContext的控制器时,会出现以下错误:

InvalidOperationException: No database provider has been configured 
for this DbContext. A provider can be configured by overriding the
DbContext.OnConfiguring method or by using AddDbContext on the 
application service provider. If AddDbContext is used, then also 
ensure that your DbContext type accepts a DbContextOptions<TContext> 
object in its constructor and passes it to the base constructor for 
DbContext.
InvalidOperationException:未配置数据库提供程序
对于这个DbContext。可以通过重写
DbContext.OnConfiguring方法,或在
应用程序服务提供商。如果使用AddDbContext,那么
确保DbContext类型接受DbContextOptions
对象,并将其传递给基础构造函数以进行
DbContext。

我假设这是因为我使用异步lambda从密钥库获取连接字符串,但是,我不确定该怎么办。这是从Azure KeyVault获取用于Startup.cs的连接字符串的正确方法吗?我应该换一种方式吗?任何帮助都将不胜感激。谢谢。

配置失败的原因是回调现在是
async void
。 从lambda来看,这并不明显,但它实际上是“开火并忘记”。 等待密钥保管库客户端时,它将从回调返回,而不配置提供程序

至于解决方案,我认为最好将密钥vault机密添加到配置系统中,这样您就可以从那里使用它们,就像它们来自JSON文件或任何其他源一样

不久前我写了一篇关于这个的文章:。 我在文章中使用了托管标识进行身份验证,但我看到您也在使用它:)

以下是如何在ASP.NET Core 2.x中将密钥库配置为配置源的示例:

public static IWebHost BuildWebHost(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>()
        .ConfigureAppConfiguration((ctx, builder) =>
        {
            //Build the config from sources we have
            var config = builder.Build();
            //Add Key Vault to configuration pipeline
            builder.AddAzureKeyVault(config["KeyVault:BaseUrl"]);
        })
        .Build();
您必须创建一个名为ConnectionString--DefaultConnection的秘密,并将连接字符串作为值

然后,在配置时,只需使用
Configuration[“ConnectionString:DefaultConnection”]
获取连接字符串。
如果添加了密钥库配置,并且找到了具有正确名称的密钥,则它将来自密钥库。

配置失败的原因是回调现在是
async void
。 从lambda来看,这并不明显,但它实际上是“开火并忘记”。 等待密钥保管库客户端时,它将从回调返回,而不配置提供程序

至于解决方案,我认为最好将密钥vault机密添加到配置系统中,这样您就可以从那里使用它们,就像它们来自JSON文件或任何其他源一样

不久前我写了一篇关于这个的文章:。 我在文章中使用了托管标识进行身份验证,但我看到您也在使用它:)

以下是如何在ASP.NET Core 2.x中将密钥库配置为配置源的示例:

public static IWebHost BuildWebHost(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>()
        .ConfigureAppConfiguration((ctx, builder) =>
        {
            //Build the config from sources we have
            var config = builder.Build();
            //Add Key Vault to configuration pipeline
            builder.AddAzureKeyVault(config["KeyVault:BaseUrl"]);
        })
        .Build();
您必须创建一个名为ConnectionString--DefaultConnection的秘密,并将连接字符串作为值

然后,在配置时,只需使用
Configuration[“ConnectionString:DefaultConnection”]
获取连接字符串。
如果添加了密钥库配置并找到了具有正确名称的密码,则该密码将来自密钥库。

我认为将密码注入配置系统是最简单的方法:。异步void无疑是您的问题。在密钥库答复之前,回调将返回。@juunas我认为您的解决方案非常棒,如果您将其作为答案提交,我将选择它为正确答案。我认为将机密注入配置系统是最简单的方法:。异步void无疑是您的问题。在密钥库回复之前,回调将返回。@juunas我认为您的解决方案非常棒,如果您将其作为答案提交,我将选择它作为正确答案。