我们已经将某些.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读取数据。
答案 0 :(得分:4)
这似乎是由于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
答案 1 :(得分:0)
对于某些在本地使用 SQL Server 的开发人员来说,更改为 -bionic
可能还不够。
对于在本地 (localhost) 使用 SQL Server 的人,将连接字符串 Data Source
从 localhost 更改为指定的 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 Server 配置管理器的 TCP\IP 协议尚未启用。在 "Computer Management
" => SQL Server Config Manager
=> Protocols for MSSQLSERVER
中更改它们(在我的情况下)。