C# EF上下文在docker中没有响应

C# EF上下文在docker中没有响应,c#,.net,docker,entity-framework-core,core,C#,.net,Docker,Entity Framework Core,Core,我刚刚将我的Web API应用程序升级到.NET core 3.0,在IIS Express中以调试模式运行时一切正常,但在服务器或VS debug上的docker容器中运行时,上下文不响应。没有抛出错误,只是从不响应 我尝试将更新的映像部署到服务器,这是我第一次注意到问题的地方。然后我尝试在vs中以docker的身份运行以进行调试。 我已经更新了所有NuGet软件包,并将框架设置为.NET Core 3.0或.NET Standard 2.1。 我在调试中检查了上下文连接字符串,它似乎是正确的

我刚刚将我的Web API应用程序升级到.NET core 3.0,在IIS Express中以调试模式运行时一切正常,但在服务器或VS debug上的docker容器中运行时,上下文不响应。没有抛出错误,只是从不响应

我尝试将更新的映像部署到服务器,这是我第一次注意到问题的地方。然后我尝试在vs中以docker的身份运行以进行调试。 我已经更新了所有NuGet软件包,并将框架设置为.NET Core 3.0或.NET Standard 2.1。 我在调试中检查了上下文连接字符串,它似乎是正确的。我使用.NETCore2.2回滚到早期的映像,所有映像都使用相同的启动参数按预期工作。 我创建了一个不使用上下文的测试方法,它在服务器和VS docker调试中返回正确的值。 我尝试将该方法更改为使用对上下文的同步调用,但没有改变行为。 测试数据库非常小,仅查询表中的3条记录

    public async Task<List<SendingSystemInfoResponse>> getSendingSystemInfoList()
    {
        try
        {
            return await _context.EmailSendingSystem.Where(m => !m.Deleted && m.Active == true).Select(m => new SendingSystemInfoResponse
            {
                SystemId = m.EmailSendingSystemId,
                SystemName = m.Title,
                SystemDescription = m.Description

            }).ToListAsync();
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, string.Format("EmailDataAccess: Exception retrieving EmailSendingSystem List"));
            throw;
        }
    }
------更新----- 所以,我今天一直在断断续续地做这件事,有更多的信息可以帮助别人为我指明正确的方向。 我创建了一个简单的测试Web API项目,使用.NET core 3.0和最新的NuGet软件包在本地PC上运行到SQL Server的EF连接,并启用了到本地运行的SQL Server的TCP/IP连接。我能够让它连接到数据库并返回值

接下来,我在本地SQL Server上创建了测试数据库的副本。这也起到了作用,Web API在Docker运行的原始问题中连接并返回了数据。 然后,我将连接字符串更改为指向测试SQL Server,并且进程挂起在同一位置,没有任何错误。 接下来,我测试了它,连接仍然指向测试SQL Server,但运行在IIS Express而不是Docker中。同样,一切都如期进行

然后,我尝试运行使用.NET Core 2.2的早期版本docker映像,它还从测试SQL Server返回数据

在Docker中使用.NET Core 3.0时,当所有其他组合工作正常时,我无法通过IP连接到测试SQL Server的原因可能是什么

------更新2----- 我在测试SQL Server上为新的简单测试Web API项目创建了必要的数据库,并更改了简单Web API项目连接字符串。这个新的、干净、简单的.NET Core 3项目在作为Docker运行时也没有连接到测试SQL Server,但在IIS Express上运行时工作正常。在Docker中运行,但通过IP连接到我的本地数据库时,它也可以正常工作

Docker中的.NET Core 3发生了一些变化,阻止它连接到外部数据库服务器。有人知道我需要做什么来解决这个问题吗

--更新3----- 多亏了马特!在阅读了Matt的回复后,我无法让RUN命令在docker文件中工作,但将我的基本图像更改为bionic确实有效。我也一直在与微软的技术支持部门合作,他们也给我指出了Matt提供的链接。 也许我只是没有将RUN命令放在正确的位置,所以如果有人能够提供一个使用RUN命令解决此问题的示例docker文件,我将不胜感激。 以下是一个简单测试项目中更新的docker文件:

    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-buster AS build
    WORKDIR /src
    COPY ["WebApplication1/WebApplication1.csproj", "WebApplication1/"]
    RUN dotnet restore "WebApplication1/WebApplication1.csproj"
    COPY . .
    WORKDIR "/src/WebApplication1"
    RUN dotnet build "WebApplication1.csproj" -c Release -o /app/build

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

    FROM base AS final
    WORKDIR /app
    COPY --from=publish /app/publish .
    ENTRYPOINT ["dotnet", "WebApplication1.dll"]
---最终更新------

我再次尝试了docker文件中的RUN命令,但这次得到了正确的结果。这是docker文件的版本

    FROM mcr.microsoft.com/dotnet/core/aspnet:3.0-buster-slim AS base
    WORKDIR /app
    RUN sed -i 's/DEFAULT@SECLEVEL=2/DEFAULT@SECLEVEL=1/g' /etc/ssl/openssl.cnf
    RUN sed -i 's/DEFAULT@SECLEVEL=2/DEFAULT@SECLEVEL=1/g' /usr/lib/ssl/openssl.cnf
    EXPOSE 80

    FROM mcr.microsoft.com/dotnet/core/sdk:3.0-buster AS build
    WORKDIR /src
    COPY ["WebApplication1/WebApplication1.csproj", "WebApplication1/"]
    RUN dotnet restore "WebApplication1/WebApplication1.csproj"
    COPY . .
    WORKDIR "/src/WebApplication1"
    RUN dotnet build "WebApplication1.csproj" -c Release -o /app/build

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

    FROM base AS final
    WORKDIR /app
    COPY --from=publish /app/publish .
    ENTRYPOINT ["dotnet", "WebApplication1.dll"]

我相信您遇到的问题记录在这里:。正如您所说,由于默认情况下这些Docker映像基于Debian Buster,所以.NET Core 3确实发生了一些变化。Buster配置为使用1.2作为最低TLS协议,这是对以前版本的更改(请参阅)

可通过将以下内容添加到Dockerfile来临时修复此问题:

RUN sed -i 's/MinProtocol = TLSv1.2/MinProtocol = TLSv1/g' /etc/ssl/openssl.cnf
RUN sed -i 's/MinProtocol = TLSv1.2/MinProtocol = TLSv1/g' /usr/lib/ssl/openssl.cnf

这不是一个很好的解决方案,因为它本质上是在降级TLS的版本。更好的长期解决方案是在SQL Server上启用TLS 1.2(请参阅)。

将Matt的响应标记为答案。我找不到正确的方法将两个RUN命令放入docker文件以使其正常工作,但GitHub的链接确实提到了使用image aspnet:3.0-bionic并将我的基本图像更改为this确实对我有效。docker文件中是否有一个特定的位置应放置此命令?或者它可以放在文件中的任何位置?我在问题的末尾添加了示例DockerFile,其中的位置对我来说非常有用,可以使用不同的基本映像和运行命令来降级TLS。感谢您保持此问题的最新状态。可以确认最终更新确实解决了问题。但是,正如@Matt Thalman所说的,要小心——这并不是一个真正的长期解决方案。
RUN sed -i 's/MinProtocol = TLSv1.2/MinProtocol = TLSv1/g' /etc/ssl/openssl.cnf
RUN sed -i 's/MinProtocol = TLSv1.2/MinProtocol = TLSv1/g' /usr/lib/ssl/openssl.cnf