no1*_*no1 10 sql-server docker .net-core-3.0
我们已将部分 .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 在下面评论中的建议,我使用手写 SQL 和 DataReader 将测试项目中的数据访问权限更改为 Microsoft.Data.SqlClient。然后,我为 .net core 3.0 重新创建了 Dockerfile,并验证引用了正确的容器映像。相同的行为:在与 SQL Server 的 PreLogin 握手时挂起。切换到 .net core 2.2 并且能够从 SQL Server 连接和读取数据。
no1*_*no1 16
这似乎是由于 Linux 映像使用的 TLS 版本所致。在 GitHub .NET Core 团队的帮助下,我们将 Dockerfile 中的图像从 buster-slim 更改为仿生。
FROM mcr.microsoft.com/dotnet/core/aspnet:3.0-bionic AS base
WORKDIR /app
EXPOSE 80
FROM mcr.microsoft.com/dotnet/core/sdk:3.0-bionic AS build
Run Code Online (Sandbox Code Playgroud)
https://github.com/dotnet/SqlClient/issues/222