我们正在尝试在 ASP.NET Core WebApi 应用程序 (.NET 5) 中首次使用 Hangfire (v1.7.19)。以前他们都是老派的 ASP.NET,并且工作没有问题。
使用的 Hangfire 包(根据Hangfire 文档)是Hangfire.Core
,Hangfire.SqlServer
和Hangfire.AspNetCore
. 我们也尝试只使用组合Hangfire
包,但结果相同。
直接从该文档页面上的代码中提取,在 ConfigureServices 我们添加
services.AddHangfire(configuration => configuration
.SetDataCompatibilityLevel(CompatibilityLevel.Version_170)
.UseSimpleAssemblyNameTypeSerializer()
.UseRecommendedSerializerSettings()
.UseSqlServerStorage(connectionString), new SqlServerStorageOptions
{
CommandBatchMaxTimeout = TimeSpan.FromMinutes(5),
SlidingInvisibilityTimeout = TimeSpan.FromMinutes(5),
QueuePollInterval = TimeSpan.Zero,
UseRecommendedIsolationLevel = true,
DisableGlobalLocks = true
}));
它在运行时给出
System.ArgumentException
HResult=0x80070057
Message=Keyword not supported: 'authentication'.
Source=System.Data.SqlClient
StackTrace:
at System.Data.Common.DbConnectionOptions.ParseInternal(Dictionary`2 parsetable, String connectionString, Boolean buildChain, Dictionary`2 synonyms)
at System.Data.Common.DbConnectionOptions..ctor(String connectionString, Dictionary`2 synonyms)
at System.Data.SqlClient.SqlConnectionString..ctor(String connectionString)
at System.Data.SqlClient.SqlConnectionFactory.CreateConnectionOptions(String connectionString, DbConnectionOptions previous)
at System.Data.ProviderBase.DbConnectionFactory.GetConnectionPoolGroup(DbConnectionPoolKey key, DbConnectionPoolGroupOptions poolOptions, DbConnectionOptions& userConnectionOptions)
at System.Data.SqlClient.SqlConnection.ConnectionString_Set(DbConnectionPoolKey key)
at System.Data.SqlClient.SqlConnection.set_ConnectionString(String value)
at System.Data.SqlClient.SqlConnection..ctor(String connectionString)
at Hangfire.SqlServer.SqlServerStorage.<.ctor>b__6_0()
at Hangfire.SqlServer.SqlServerStorage.CreateAndOpenConnection()
at Hangfire.SqlServer.SqlServerStorage.UseConnection[T](DbConnection dedicatedConnection, Func`2 func)
at Hangfire.SqlServer.SqlServerStorage.UseConnection(DbConnection dedicatedConnection, Action`1 action)
at Hangfire.SqlServer.SqlServerStorage.Initialize()
at Hangfire.SqlServer.SqlServerStorage..ctor(String nameOrConnectionString, SqlServerStorageOptions options)
at Hangfire.SqlServer.SqlServerStorage..ctor(String nameOrConnectionString)
at Hangfire.SqlServerStorageExtensions.UseSqlServerStorage(IGlobalConfiguration configuration, String nameOrConnectionString)
的connectionString
值为
Initial Catalog=XXX;Data Source=YYY;Authentication=Active Directory Password;UID=ZZZ;PWD=PPP"
这适用于本地 SqlServer 和 LocalDb,但不适用于 AzureDB。连接字符串正是我们也用于 EntityFrameworkCore 5 的连接字符串(实际上,该值是从 分配的context.Database.GetConnectionString()
)。
我已经阅读了 AzureDB 和 .NET Core 存在问题的地方,但这些问题在很久以前就已经解决了。查看Hangfire.SqlServer
包依赖项,我看到它在哪里使用System.Data.SqlClient
,AzureDB 使用的当前文档都参考了Microsoft.Data.SqlClient
,这让我认为支持 Active Directory 密码身份验证的增强功能不是在新包中进行的,System.Data.SqlClient
而是在较新的Microsoft.Data.SqlClient
包中进行的。如果是这种情况,我可以请求 Hangfire 替换它的 SqlClient 包,但在我这样做之前希望得到确认。
如果确实如此,有什么想法吗?在此期间我们可以做些什么来解决这个问题吗?
提前致谢。