Dockerized .NET6 应用程序抛出 Microsoft.Data.SqlClient.SqlException (0x80131904) 错误

Dockerized .NET6 application throws Microsoft.Data.SqlClient.SqlException (0x80131904) error

我有一个使用 Azure Sql 服务器的 .net6 应用程序。该应用程序在 .Net3.1 上运行良好,但当移植到 .Net6 时,应用程序抛出 Sql 服务器错误

Microsoft.Data.SqlClient.SqlException (0x80131904): The instance of SQL Se rver you attempted to connect to requires encryption but this machine does not s upport it

dockerfile 非常通用,如下所示

FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app

FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY ["Presentation/Web.Cms/Web.Cms.csproj", "Presentation/Web.Cms/"]
RUN dotnet restore "Presentation\Web.Cms\Web.Cms.csproj"
COPY . .
WORKDIR "/src/Presentation/Web.Cms"
RUN dotnet build "Web.Cms.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "Web.Cms.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "Web.Cms.dll"]
EXPOSE 80
EXPOSE 443
USER ContainerAdministrator

Microsoft.Data.SqlClient如果服务器支持,v2.0 及更高版本默认使用加密。

如果服务器使用不被服务器信任的证书,这将导致问题。在这种情况下,异常将包含一条消息(直接或在内部异常中),说明服务器证书不受信任。在这种情况下,您可以将 TrustServerCertificate=true 添加到连接字符串。

容器特有的另一个问题在Unable to open connection to azure sql database from windows1809 container with Microsoft.Data.SqlClient 2.0.0中描述:容器镜像可能没有C:\Windows\System32中的Security.dll。在那一期中使用了 Nano 图像。

Windows Containers repo 中存在相关问题。似乎至少 .NET 5 运行时基础映像没有 Security.dll.

SqlClient 问题中提到的解决方法之一是将文件复制到那里。链接问题中的一些评论显示了如何执行此操作。

从命令行

docker cp C:\Windows\System32\security.dll container-name:/Windows/System32/security.dll

或在docker文件中

COPY --from=core /Windows/System32/security.dll /Windows/System32/security.dll

另一个是启用 Managed networking on Windows,这也消除了对 Microsoft.Data.SqlClient.SNI 二进制文件的需要。要启用此功能,请在启动时设置以下开关:

AppContext.SetSwitch("Switch.Microsoft.Data.SqlClient.UseManagedNetworkingOnWindows", true);

文章中提到的缺点是

Managed SNI does not support non-domain Windows Authentication.