【发布时间】:2021-04-15 19:31:54
【问题描述】:
我们已将部分 .NET Core 2.2 应用程序升级到 .NET Core 3.0。升级后,我们在 Docker 容器中运行的应用程序无法连接到在我们域网络中的独立计算机上运行的 SQL Server 2016。查看数据包跟踪,我们看到连接在登录前握手时挂起,并最终超时。切换回 .NET Core 2.2 可以立即解决问题,并且我们的容器可以再次连接到我们的数据库。
我们显然已经验证不存在 DNS 问题,因为这些容器是在 .NET Core 2.2 的生产环境中运行的。 .NET Core 3.0 破坏了它们,因为它们无法通过网络连接到 SQL Server,因此我们现在回滚到 2.2 并终止升级,直到我们可以确定为什么 .NET Core 2.2 容器连接到我们的 SQL Server 而 .NET Core 3.0容器没有。
我们还从头开始创建了新的 .NET Core 3.0 项目来测试连接。结果是一样的:在预登录到 SQL Server 期间容器超时。将项目改回 .NET Core 2.2,同时将 EF Core 改回 2.2.6,问题立即得到解决。
由于我们使用 EF Core 进行数据访问,我们也尝试将 EF Core 保留为 2.2.6,但将项目升级到 .NET Core 3.0,但连接仍然超时。
如果我们不添加 Docker 支持并将应用程序作为控制台或 Web 应用程序(未容器化)运行,那么 .NET Core 3.0 就没有问题。只有当我们将它们容器化时,.NET Core 3.0 应用程序才会无法连接到 SQL Server。
根据 Dan 在下面 cmets 中的建议,我使用手写 SQL 和 DataReader 将测试项目中的数据访问更改为 Microsoft.Data.SqlClient。然后,我为 .net core 3.0 重新创建了 Dockerfile,并验证是否引用了正确的容器映像。相同的行为:在与 SQL Server 的 PreLogin 握手时挂起。切换到 .net core 2.2 并能够从 SQL Server 连接和读取数据。
【问题讨论】:
-
我没有答案,但我假设您使用的是
System.Data.SqlClient?如果是这样,我很好奇您是否对Microsoft.Data.SqlClient 有同样的问题。也许您可以使用测试容器尝试一下。 -
很好的建议,但不幸的是它在测试容器中的行为完全相同:适用于 .net core 2.2 但不适用于 .net core 3.0。我会添加到帖子中。不过谢谢!
-
@no1 您如何从 dotnet 核心容器化应用程序独立连接到 ms sql?
标签: sql-server docker .net-core-3.0