当我将连接字符串硬编码到我的项目中时,它工作得很好,而且,Azure Key Vault 在发布模式下运行时工作得很好。但是,当我尝试使用 Secrets.json 时,某些端点仍然有效,但其他端点返回此错误:
System.InvalidOperationException: The ConnectionString property has not been initialized.
at Microsoft.Data.SqlClient.SqlConnection.PermissionDemand()
at Microsoft.Data.SqlClient.SqlConnectionFactory.PermissionDemand(DbConnection outerConnection)
at Microsoft.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
at Microsoft.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
at Microsoft.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry, SqlConnectionOverrides overrides)
at Microsoft.Data.SqlClient.SqlConnection.InternalOpenAsync(CancellationToken cancellationToken)
正如我提到的,对 URL 进行硬编码可以正常工作,并且在发布版本中运行也可以正常工作,
这是我的 Program.cs 中的内容:
var builder = WebApplication.CreateBuilder(args);
#if DEBUG
builder.Configuration.AddUserSecrets<Program>();
#else
var vaultUri = Environment.GetEnvironmentVariable("VaultUri");
var keyVaultEndpoint = new Uri(vaultUri);
builder.Configuration.AddAzureKeyVault(keyVaultEndpoint, new DefaultAzureCredential());
#endif
在我的数据库上下文中:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
#if DEBUG
string connectionString = _configuration.GetConnectionString("HomeDatabase");
#else
string connectionString = _configuration.GetConnectionString("AzureDatabase");
#endif
optionsBuilder.UseSqlServer(connectionString);
}
我尝试设置断点,似乎出于某种原因,在调试时,字符串设置正确,但出于某种原因,在点击步骤一千次后,它跳回“string connectionString = _configuration.GetConnectionString( “主页数据库”);“在该行,connectionString 突然变为 null...
补充一下,简单的端点似乎可以工作,但是如果我的 dbcontxt 被第二次调用,那么连接字符串就会变为空。
如果有人有任何想法,我将非常感激。
谢谢你。 :)
编辑~~~~~~~~~~~~~~~~~~~
在尝试了更多之后,不厌其烦地使用新的数据库上下文创建一个新数据库来处理令牌。一旦我添加了秘密,我再次收到空错误...
这些秘密似乎一直保留到使用它们的上下文完成为止。
最后我想通了。我的授权处理程序和中间件存在冲突。通过删除中间件并让自定义授权处理程序处理所有事情来修复它。