ASPNET Core 7应用无法访问LocalDB数据库求助
IIS部署ASP.NET Core 7应用访问LocalDB失败问题
核心错误
使用Entity Framework访问本地SQL数据库时触发错误:Cannot open database aspnet requested by the login. The login failed. Login failed for user IIS APPPOOL
环境信息
- 生产环境:Windows Server 2016 + IIS 10,部署ASP.NET Core 7 Web应用(物理服务器)
- 开发环境:VS 2022,服务器同时运行SQL Express,同一应用可正常访问SQL Express
关键现象
- Windows应用池用户能访问SQL Express,但无法访问
(localdb)\mssqllocaldb中的数据库(错误提示“无法打开数据库”,登录本身成功) - 应用在开发机器上可正常创建EF数据库并运行,部署到服务器后IIS工作进程无法访问EF数据库
- 可在生产服务器和开发机器上通过SQL Server Management Studio 18登录两者,登录/用户及权限看似正常
连接字符串
Server=(localdb)\mssqllocaldb;Database=aspnet;Trusted_Connection=True;MultipleActiveResultSets=true;
异常触发点
Program.cs中app.Run()前的代码行触发EF查询并抛出异常:
if (await userManager.FindByEmailAsync(sUserEmail) == null)
已尝试但无效的步骤
- 将数据库重命名为仅含大小写字母的简单名称
- 将数据库用户名改为简单名称(替代IIS APPPOOL...)
- 确认数据库中登录及用户的权限
- 在IIS中启用Windows身份验证(尽管SQL Express已正常工作)
- 为IIS APPPOOL\用户添加数据库文件及文件夹权限
- 删除EF数据库并通过
Update-Database重新创建 - 使用管理员权限运行SQL Server Management Studio和Visual Studio重复所有操作
- 启用
EnableRetryOnFailure(尝试性操作)
后续计划
正在研究Identity的自定义存储,下一步计划尝试在SQL Express中重新创建数据库并修改连接字符串指向它,但希望先解决当前LocalDB的连接障碍。注:本文未写出数据库和应用池用户的完整名称,如需其他信息请告知。
完整异常信息
System.InvalidOperationException: 引发了一个可能由瞬态故障导致的异常。请考虑通过在 'UseSqlServer' 调用中添加 'EnableRetryOnFailure' 来启用瞬态错误弹性。 ---> Microsoft.Data.SqlClient.SqlException (0x80131904): 无法打开登录请求的数据库 "aspnet"。登录失败。 用户 'IIS APPPOOL\' 登录失败。 在 Microsoft.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) 在 Microsoft.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) 在 Microsoft.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) 在 Microsoft.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) 在 Microsoft.Data.SqlClient.SqlInternalConnectionTds.CompleteLogin(Boolean enlistOK) 在 Microsoft.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfo serverInfo, String newPassword, SecureString newSecurePassword, Boolean ignoreSniOpenTimeout, TimeoutTimer timeout, Boolean withFailover) 在 Microsoft.Data.SqlClient.SqlInternalConnectionTds.LoginNoFailover(ServerInfo serverInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString connectionOptions, SqlCredential credential, TimeoutTimer timeout) 在 Microsoft.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(TimeoutTimer timeout, SqlConnectionString connectionOptions, SqlCredential credential, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance) 在 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) 在 Microsoft.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection, DbConnectionOptions userOptions) 在 Microsoft.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnectionPool pool, DbConnection owningObject, DbConnectionOptions options, DbConnectionPoolKey poolKey, DbConnectionOptions userOptions) 在 Microsoft.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection) 在 Microsoft.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection) 在 Microsoft.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, UInt32 waitForMultipleObjectsTimeout, Boolean allowCreate, Boolean onlyOneCheckConnection, DbConnectionOptions userOptions, DbConnectionInternal& connection) 在 Microsoft.Data.ProviderBase.DbConnectionPool.WaitForPendingOpen() --- 来自之前位置的堆栈跟踪结束 --- 在 Microsoft.EntityFrameworkCore.Storage.RelationalConnection.OpenInternalAsync(Boolean errorsExpected, CancellationToken cancellationToken) 在 Microsoft.EntityFrameworkCore.Storage.RelationalConnection.OpenInternalAsync(Boolean errorsExpected, CancellationToken cancellationToken) 在 Microsoft.EntityFrameworkCore.Storage.RelationalConnection.OpenAsync(CancellationToken cancellationToken, Boolean errorsExpected) 在 Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteReaderAsync(RelationalCommandParameterObject parameterObject, CancellationToken cancellationToken) 在 Microsoft.EntityFrameworkCore.Query.Internal.SingleQueryingEnumerable`1.AsyncEnumerator.InitializeReaderAsync(AsyncEnumerator enumerator, CancellationToken cancellationToken) 在 Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerExecutionStrategy.ExecuteAsync[TState,TResult](TState state, Func`4 operation, Func`4 verifySucceeded, CancellationToken cancellationToken) ClientConnectionId:1a0e38a7-1bee-4d50-b1f4-2a10fdd3e7aa 错误编号:4060,状态:1,级别:11 --- 内部异常堆栈跟踪结束 --- 在 Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerExecutionStrategy.ExecuteAsync[TState,TResult](TState state, Func`4 operation, Func`4 verifySucceeded, CancellationToken cancellationToken) 在 Microsoft.EntityFrameworkCore.Query.Internal.SingleQueryingEnumerable`1.AsyncEnumerator.MoveNextAsync()
内容的提问来源于stack exchange,提问作者RoyM
相关产品推荐
相关产品推荐

