.NET Core 3.0 Docker 容器无法连接到 SQL 服务器

.NET Core 3.0 Docker Container Won't Connect to SQL Server

我们已将一些 .NET Core 2.2 应用程序升级到 .NET Core 3.0。升级后,我们在 Docker 容器中的应用程序 运行ning 无法连接到我们域网络中独立计算机上的 SQL Server 2016 运行ning。查看数据包跟踪,我们看到连接在登录前握手时挂起,并最终超时。切换回 .NET Core 2.2 立即解决了这个问题,我们的容器可以再次连接到我们的数据库。

我们显然已验证不存在 DNS 问题,因为这些容器 运行 在生产环境中使用 .NET Core 2.2。 .NET Core 3.0 破坏了它们,因为它们无法通过网络连接到 SQL 服务器,因此我们暂时回滚到 2.2 并终止升级,直到我们可以确定为什么 .NET Core 2.2 容器连接到我们的 [=27] =] 服务器,但 .NET Core 3.0 容器没有。

我们还从头开始创建了新的 .NET Core 3.0 项目来测试连接。结果是一样的:容器在预登录 SQL 服务器期间超时。将项目改回 .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 服务器。

根据 Dan 在下面评论中的建议,我使用手写 SQL 和 DataReader 将测试项目中的数据访问更改为 Microsoft.Data.SqlClient。然后,我为 .net core 3.0 重新创建了 Docker 文件,并验证了是否引用了正确的容器映像。相同的行为:在与 SQL 服务器的 PreLogin 握手时挂起。切换到 .net core 2.2 并且能够连接并从 SQL 服务器读取数据。

这似乎是由于 Linux 图像使用的 TLS 版本。在 GitHub 的 .NET Core 团队的帮助下,我们在 Dockerfile 中将图像从 buster-slim 更改为 bionic。

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

https://github.com/dotnet/SqlClient/issues/222

对于某些在本地使用 SQL 服务器的开发人员来说,更改为 -bionic 可能还不够。

对于使用 SQL 本地服务器 (localhost) 的人,更改连接字符串,Data Source 从本地主机到指定的 IP 可能会解决问题。

"ConnectionStrings": {"myDb1": "Data Source=DESKTOP-MGSE697;Initial Catalog=master;User ID=sa;Password=xxx"}

"ConnectionStrings": {"myDb1": "Data Source=xxx.xxx.xxx.xxx,1433;Initial Catalog=master;User ID=sa;Password=123456"}

在大多数情况下,SQL 服务器配置管理器的 TCP\IP 协议尚未启用。在“Computer Management”中更改它们 => SQL Server Config Manager => Protocols for MSSQLSERVER(在我的例子中)。

Screenshot of Computer Management