从 dotnetcore Web 应用程序连接到 AWS RDS

Posted

技术标签:

【中文标题】从 dotnetcore Web 应用程序连接到 AWS RDS【英文标题】:Connecting to AWS RDS from dotnetcore web app 【发布时间】:2021-09-21 19:18:47 【问题描述】:

我设置了一个 .NET Core 项目,该项目将使用来自 AWS RDS SQL Server 实例的数据库连接,并且无法从应用程序连接到它。奇怪的是,从SSMS,Visual Studio Server explorer我可以看到数据库,只有应用程序拒绝连接。

基础设置:

RDS SQL Server 实例已启动并运行,包含数据库,使用 forceSSL 入站/出站规则设置为允许 SQL Server 类型的流量

充满测试数据的数据库

使用此连接字符串:

"DefaultConnection": "Server=erp-devtest...amazonaws.com;Initial Catalog=...;Persist Security Info=True;User ID=...;Password=..."

从以下位置连接到数据库:

SSMS = 正常 Visual Studio 服务器资源管理器 = 正常 .NET Core 应用 = nok

看到日志,似乎应用程序无法访问服务器,因为服务器端没有触发任何内容。

应用程序在尝试连接时收到此错误消息:

"   at Microsoft.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)\r\n   at Microsoft.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)\r\n   at Microsoft.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)\r\n   at Microsoft.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)\r\n   at Microsoft.Data.SqlClient.SqlDataReader.TryConsumeMetaData()\r\n   at Microsoft.Data.SqlClient.SqlDataReader.get_MetaData()\r\n   at Microsoft.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString, Boolean isInternal, Boolean forDescribeParameterEncryption, Boolean shouldCacheForAlwaysEncrypted)\r\n   at Microsoft.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean isAsync, Int32 timeout, Task& task, Boolean asyncWrite, Boolean inRetry, SqlDataReader ds, Boolean describeParameterEncryptionRequest)\r\n   at Microsoft.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean& usedCache, Boolean asyncWrite, Boolean inRetry, String method)\r\n   at Microsoft.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)\r\n   at Microsoft.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior)\r\n   at Microsoft.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior)\r\n   at System.Data.Common.DbCommand.ExecuteReader()\r\n   at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteReader(RelationalCommandParameterObject parameterObject)\r\n   at Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable`1.Enumerator.InitializeReader(DbContext _, Boolean result)\r\n   at Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerExecutionStrategy.Execute[TState,TResult](TState state, Func`3 operation, Func`3 verifySucceeded)\r\n   at Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable`1.Enumerator.MoveNext()\r\n   at System.Linq.Enumerable.SingleOrDefault[TSource](IEnumerable`1 source)\r\n   at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.Execute[TResult](Expression query)\r\n   at Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryProvider.Execute[TResult](Expression expression)\r\n   at System.Linq.Queryable.FirstOrDefault[TSource](IQueryable`1 source)\r\n   at DatabaseLayer.Core.Management.ProjectManagement.Get(SearchParameterDTO`1 searchParameterDTO) in ..."

你有什么办法解决这个问题吗?

更新

导致错误的调用:

try
            
                Invoice invoice = _contentDbContext.Invoice.FirstOrDefault();  
            
catch (Exception ex)
             

其中 Invoice 是通常使用 EF Core 访问的现有表和类。

ex 返回此错误消息:

ex = "无效的对象名称'发票'。"

异常有一个错误

[0] = Microsoft.Data.SqlClient.SqlError: 无效的对象名称“发票”。

上面提到的堆栈跟踪是由

抛出的

ex.SerializationStackTraceString

当我使用指向另一个数据库的有效连接字符串时,发票按预期返回

【问题讨论】:

您需要发布实际的错误消息——不仅仅是堆栈跟踪.....它可以告诉我们在哪里发生错误,但它无法告诉我们什么错误是什么! 感谢@marc_s,我在原帖中做了一些更新。 【参考方案1】:

没关系,一切都设置正确。我搞砸了,我已经从稍旧的备份中恢复了数据库,我的类与 ...set 具有相同的名称。因此,一次迁移到最新版本就可以了。 :)

感谢阅读 //如果你知道如何找回我浪费的几个小时来完成这篇文章,请不要犹豫,联系我 ;)

【讨论】:

以上是关于从 dotnetcore Web 应用程序连接到 AWS RDS的主要内容,如果未能解决你的问题,请参考以下文章

无法从 Web 应用程序连接到 localhost:3000

如何从运行在 WebSphere 应用程序服务器 v7 上的 Web 应用程序通过 JMS 连接到 Web 方法?

从 Django 连接到外部 Web 套接字 api

如何从 AngularJS 站点安全地连接到 web api

无法从 ASP.NET Web 应用程序连接到我的 SQL Server Express

无法从 Web 服务器连接到 SQL Server Express