无法从docker支持的asp.net核心项目连接到sql server

问题描述 投票:2回答:3

我有一个ASP.NET Core 2.2项目,我打开了docker支持。只要不需要数据库连接,项目就可以正常运行。例如登录。当我输入用户凭据时,我收到如下错误。

处理请求时发生未处理的异常。 Win32Exception:连接尝试失败,因为连接方在一段时间后没有正确响应,或者建立的连接失败,因为连接的主机无法响应

未知位置SqlException:建立与SQL Server的连接时发生与网络相关或特定于实例的错误。服务器未找到或无法访问。验证实例名称是否正确,以及SQL Server是否配置为允许远程连接。 (提供程序:TCP提供程序,错误:0 - 连接尝试失败,因为连接方在一段时间后没有正确响应,或者由于连接主机无法响应而建立连接失败。)

System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity,SqlConnectionString connectionOptions,object providerInfo,bool redirectedUserInstance,SqlConnectionString userConnectionOptions,SessionData reconnectSessionData,bool applyTransientFaultHandling)InvalidOperationException:引发了可能由于瞬时故障引起的异常。如果要连接到SQL Azure数据库,请考虑使用SqlAzureExecutionStrategy。

Microsoft.EntityFrameworkCore.Storage.Internal.SqlServerExecutionStrategy + d__7.MoveNext()

以前在我的sql server配置管理器中未启用TCP / IP时错误是不同的。(不记得错误)我按照链接https://jack-vanlightly.com/blog/2017/9/24/how-to-connect-to-your-local-sql-server-from-inside-docker中提到的步骤来解决该问题。

我也启用了TCP / IP和命名管道。我也可以使用SQL Management Studio中的IP进行连接。

当前连接字符串:

"ConnectionStrings": {
    "DefaultConnection": "Server=xxx.xx.xx.x,1433;Database=TestDB;User ID=username;Password=pwd;Trusted_Connection=True;MultipleActiveResultSets=true"
  },

如果我错过任何一步,请告诉我。我想从我的docker项目连接到本地sql

asp.net docker asp.net-core sql-server-2014-express
3个回答
4
投票

那对我有用的是:

public static string DockerHostMachineIpAddress => Dns.GetHostAddresses(new Uri("http://docker.for.win.localhost").Host)[0].ToString();

docker.for.win.localhost是docker内部dns将解析为localhost的地址(不是docker内的localhost,而是托管机器)。上面的代码为你提供了localhost的ip地址,你可以像这样创建连接字符串:

$"Server={DockerHostMachineIpAddress}\\SQL2017;Database=YourDB;User Id=Admin;Password=123;"

如果您使用的是命名的sql server实例,那么这将有效 - 将SQL2017替换为具有正确用户的ur实例名称和crediatials。

然而!对于迁移和更新数据库localhost工作正常。可能是因为它没有从docker容器处理。

编辑:

第二个解决方案有点清洁但你需要一个支持docker-compose的项目。

在docker-compose.yml文件中,您的服务定义在图像属性定义下面添加:

extra_hosts:
- "localhost:192.168.65.2"

您仍然必须知道您必须为其添加别名的IP地址(您可以通过使用原始答案找到),但是一旦您知道它就会更加干净。我在这个IP上工作的超过5台不同的机器是正确的。


3
投票

这花了我一些时间来解决,有一些小问题可能是错误的,这使它令人沮丧。由于自动生成的.net核心Web应用程序visual studio 2017项目无法直接使用,因此可能会更加令人沮丧。拥有这种体验是您第一次接触Docker并不理想。

我最初也有错误的假设,即docker镜像会在容器内部附带SQL Server,但实际情况并非如此,它正在尝试访问必须预先安装在主机上的数据库服务器。

要遵循的步骤(测试windows docker镜像,而不是linux);

1)通过运行命令提示符并键入IPCONFIG获取主机的IP地址

2)将appsettings.json文件中的数据库连接字符串设置为此IP地址,然后是SQL Server端口号,即;

192.168.X.X,1433

3)设置连接字符串不要使用Trusted_Connection(从连接字符串中删除它)和用户ID和密码中的硬编码;

用户ID = sa;密码= SuperSecurePassword;

如果我没有这样做,在某些SQL Server配置上我会收到一个不寻常的错误(不能完全记住细节!)

连接字符串显示看起来像这样;

“Server = 192.168.X.X,1433; Database = MyDatabase; User Id = sa; Password = SuperSecurePassword; MultipleActiveResultSets = true”

4)现在在主机上你需要打开Windows防火墙,并为TCP端口1433添加新的入站连接规则。

5)完成所有这些后,它仍然无效,请尝试重新启动;我挣扎了很长时间,不得不重新启动,这使它成为现实;我不确定Docker是否已正确初始化,但这主要是猜测!我真的不想说重新启动是解决问题的方法,它不是真正的答案,但在某些情况下它可以解决问题。

编辑,最后一件事,以管理员模式运行visual studio(右键单击图标,“以管理员身份运行”)也有帮助。

为旧线程的复活道歉,但是这个问题似乎仍然存在,并且考虑到需要完成的事情很少,可用的信息对于如何解决这个问题有点不完整。


1
投票

我遇到了同样的问题,采用了与您提到的网站相同的方法。如果您的网络具有标准配置,它应该像这样工作。

只需禁用公共网络的防火墙即可。

我的问题很简单,Windows似乎将Docker创建的网络分类为公共网络,因此防火墙阻止了它,就像这个一样:

Can't connect to SQL Server express from .net core app running on docker

它没有标记为答案,而是在问题中进行了编辑。

© www.soinside.com 2019 - 2024. All rights reserved.