.NET 8 Blazor部署Azure多连接时SqlException登录失败问题
.NET 8 Blazor Web应用部署Azure后间歇性SQL登录失败问题
问题现象
- 基于.NET 8 Blazor Web应用模板开发,本地运行无异常,部署到Azure后频繁触发SQL登录失败错误:
Microsoft.Data.SqlClient.SqlException (0x80131904): Login failed for user.
- 连接字符串已确认正确(本地使用相同配置无问题),问题指向服务器端
- 错误触发场景:
- 发布或重启应用后的约5分钟内
- 批量发起数据库调用时
- 应用长时间未操作后
- 间歇性极强:有时连续20分钟无异常,有时每次调用都失败;在数据库调用间添加延迟后情况有所改善,但未彻底解决
- 当前使用
DbContextFactory支持多组件并发调用,需保留该特性 - 尝试设置
TrustServerCertificate=True后问题看似消失,但因生产环境安全要求不愿启用该配置,且无法完全确认是否彻底解决
完整错误日志
2025-05-07 08:19:37.526 [Error] Microsoft.EntityFrameworkCore.Query: An exception occurred while iterating over the results of a query for context type 'My.Run.DBContext'. Microsoft.Data.SqlClient.SqlException (0x80131904): Login failed for user 'dummyuser'. at Microsoft.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) at Microsoft.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, SqlCommand command, Boolean callerHasConnectionLock, Boolean asyncClose) at Microsoft.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) at Microsoft.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) at Microsoft.Data.SqlClient.SqlInternalConnectionTds.CompleteLogin(Boolean enlistOK) at Microsoft.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfo serverInfo, String newPassword, SecureString newSecurePassword, TimeoutTimer timeout, Boolean withFailover) at Microsoft.Data.SqlClient.SqlInternalConnectionTds.LoginNoFailover(ServerInfo serverInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString connectionOptions, SqlCredential credential, TimeoutTimer timeout) at Microsoft.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(TimeoutTimer timeout, SqlConnectionString connectionOptions, SqlCredential credential, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance) at Microsoft.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, DbConnectionPool pool, Func`3 accessTokenCallback) at Microsoft.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection, DbConnectionOptions userOptions) at Microsoft.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnectionPool pool, DbConnection owningObject, DbConnectionOptions options, DbConnectionPoolKey poolKey, DbConnectionOptions userOptions) at Microsoft.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection) at Microsoft.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection) at Microsoft.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, UInt32 waitForMultipleObjectsTimeout, Boolean allowCreate, Boolean onlyOneCheckConnection, DbConnectionOptions userOptions, DbConnectionInternal& connection) at Microsoft.Data.ProviderBase.DbConnectionPool.WaitForPendingOpen()
排查与临时解决
- 已开启Azure Web应用的“始终运行”选项
- 定位到Azure SQL Server防火墙拦截问题:虽已启用“允许Azure服务和资源访问此服务器”,但应用重启后约5分钟内、批量请求时新连接仍无法通过认证
- 临时解决方案:将Web应用的静态IP加入SQL Server防火墙白名单后,问题暂时得到解决,但需要更优的长期方案
内容的提问来源于stack exchange,提问作者Braden Kayne
相关产品推荐
相关产品推荐

