ASP.NET Core 6定时任务生产环境预登录握手超时问题求助
ASP.NET Core 6定时任务调度后SQL连接预登录握手超时问题排查
开发者创建了ASP.NET Core 6定时任务控制台应用,本地运行正常,部署到生产服务器后,任务首次执行正常,但后续通过JAMS Job Scheduler调度运行时出现以下异常:
异常详情:
A connection was successfully established with the server, but then an error occurred during the pre-login handshake. (provider: SSL Provider, error: 0 - The wait operation timed out.)堆栈跟踪:
at System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, SqlCredential credential, Object providerInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString userConnectionOptions, SessionData reconnectSessionData, Boolean applyTransientFaultHandling, String accessToken) at System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection, DbConnectionOptions userOptions) at System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnectionPool pool, DbConnection owningObject, DbConnectionOptions options, DbConnectionPoolKey poolKey, DbConnectionOptions userOptions) at System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection) at System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection) at System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, UInt32 waitForMultipleObjectsTimeout, Boolean allowCreate, Boolean onlyOneCheckConnection, DbConnectionOptions userOptions, DbConnectionInternal& connection) at System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal& connection) at System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, DbConnectionInternal& connection) at System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions) at System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions) at System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry) at System.Data.SqlClient.SqlConnection.Open()已在连接字符串中添加
TrustServerCertificate=true,完整连接字符串:"Data Source=myTest;Initial Catalog=testDB;persist security info=True;User Id=testuser;Password=testPwd;MultipleActiveResultSets=True;TrustServerCertificate=true"
可能的原因及排查方向
- 连接池复用导致SSL会话失效:首次执行后连接池保留了旧连接,后续调度复用这些连接时,生产环境的SQL Server或网络设备(防火墙、负载均衡器)已主动关闭闲置SSL会话,引发预登录握手超时。可尝试在连接字符串中添加
Pooling=false禁用连接池,或调整Max Pool Size配合Connection Lifetime参数,强制连接池定期回收连接。 - 生产服务器资源瓶颈:JAMS调度任务时段,服务器CPU、内存或网络带宽被其他任务占用,导致SSL握手过程无法及时完成。检查该时段服务器的资源使用率,确认是否存在资源过载情况。
- SQL Server SSL配置变更:首次执行后生产环境SQL Server的SSL证书(如过期、更换)或加密设置发生调整,导致后续连接的预登录握手失败。验证SQL Server的SSL证书状态,确认加密规则未变更。
- JAMS调度环境的网络/权限差异:JAMS调度任务使用的运行上下文(如账号权限、网络环境)与首次执行不同,比如调度服务账号无SQL Server网络访问权限,或调度环境的防火墙规则限制了后续SSL握手流量。检查JAMS服务的运行账号权限,以及调度时的网络策略。
- 连接超时设置过短:生产环境网络延迟高于本地,而连接字符串的超时设置未适配,导致预登录握手超时。尝试添加
Connect Timeout=30(或更长时长)延长连接超时时间,观察问题是否缓解。 - 中间网络设备的SSL拦截延迟:生产环境中的防火墙、WAF或代理设备会拦截SQL连接的SSL流量,首次连接时设备缓存了会话,后续缓存过期后,设备处理延迟引发超时。联系运维团队检查网络设备的SSL拦截规则及会话超时配置。
内容的提问来源于stack exchange,提问作者Govind
相关产品推荐
相关产品推荐

