无法从Docker支持的www.example.com核心项目连接到sql serverasp.net

ztyzrc3y  于 2023-01-16  发布在  Docker
关注(0)|答案(5)|浏览(121)

我有一个ASP.NET核心2.2项目,我打开了Docker支持。该项目运行良好,只要它不需要数据库连接。例如登录。当我输入用户凭据,我得到如下错误。
处理请求时发生未经处理的异常。Win32Exception:连接尝试失败,因为连接方在一段时间后没有正确响应,或者建立的连接失败,因为连接的主机没有响应
未知位置SqlException:建立与SQL Server的连接时出现与网络相关的或特定于示例的错误。找不到服务器或无法访问服务器。请验证示例名称是否正确,以及SQL Server是否配置为允许远程连接。(提供程序:TCP提供程序,错误:0-连接尝试失败,因为连接方在一段时间后没有正确响应,或者建立的连接失败,因为连接的主机没有响应。)
作用域(数据库连接池身份标识,SqlConnectionString连接选项,对象提供程序信息,bool重定向的用户示例,SqlConnectionString用户连接选项,会话数据重新连接会话数据,bool应用临时故障处理)无效操作异常:引发了异常,可能是由于暂时性故障。如果要连接到SQL Azure数据库,请考虑使用SqlAzureExecutionStrategy。
Microsoft.实体框架核心.存储.内部. SqlServer执行策略+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

zphenhs4

zphenhs41#

这花了我一些时间来解决,有一些小问题,可能是错误的,这使得它令人沮丧。这可能会变得更令人沮丧,因为.net核心网络应用程序Visual Studio 2017项目,得到自动生成不直接开箱即用。有这样的经验,作为你的第一次接触Docker是不理想的。
我最初也有一个错误的假设,即Docker映像将与SQL Server一起包含在容器中,事实并非如此,它正在尝试访问必须预先安装在主机上的数据库服务器。
遵循的步骤(在windows docker映像上测试,而不是在linux上);
1)通过运行命令提示符并键入IPCONFIG来获取主机的IP地址
2)将appsettings.json文件中的数据库连接字符串设置为此IP地址,后跟SQL Server端口号,即;
小行星
3)将连接字符串设置为不使用Trusted_Connection(将其从连接字符串中删除)并在用户ID和密码中使用硬编码;
用户ID=sa;密码=超级安全密码;
如果我不这样做,在某些SQL Server配置上,我会得到一个不寻常的错误(不太记得细节!)
连接字符串显示如下所示;
“服务器= 192.168.X.X,1433;数据库=我的数据库;用户ID=sa;密码=超级安全密码;多个活动结果集=真”
4)现在,在主机上,你需要打开Windows防火墙,并为TCP端口1433添加一个新的入站连接规则。
5)在这一切之后,它仍然不工作,尝试重新启动;挣扎了很长时间,不得不重新启动,这使它进入了生活;我不确定Docker初始化是否正确,这主要是猜测!我真的不喜欢说重启是一个问题的修复,它不是一个真正的答案,但在某些情况下,它确实起作用。
编辑,最后一件事,在管理员模式下运行VisualStudio(右键单击图标,“以管理员身份运行”)也有帮助。
为一个旧线程的复活道歉,但这个问题似乎仍然存在,现有的信息在如何修复这个问题上有点不完整,考虑到需要做的事情很少。

zf9nrax1

zf9nrax12#

所以对我有效的是:

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,而是主机).上面的代码为你提供了一个本地主机的ip地址,你可以创建如下的连接字符串:

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

如果您使用的是命名的sql server示例,这将起作用-将SQL2017替换为ur示例名称,并将credentials替换为正确的用户。
但是!对于迁移和更新数据库,localhost工作正常。可能是因为它不是从docker容器处理的。

    • 编辑:**

第二个解决方案是一个有点干净,但你需要有一个项目,支持码头组成。
在docker-compose. yml文件中,在图像属性定义下面的服务定义中添加:

extra_hosts:
- "localhost:192.168.65.2"

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

eimct9ow

eimct9ow3#

我遇到了同样的问题,并遵循了Phil提到的所有步骤,但我仍然无法解决这个问题。最后,除了指定答案中的步骤外,我还必须通过以下步骤启用SQL Server for TCP协议。

1. Open SQL Server Configuration Manager
2. Select "SQL Server Network Configuration" > "Protocols for MSSQLSERVER"
3. Edit "TCP/IP" properties, and change "Enabled" to "Yes"
yduiuuwa

yduiuuwa4#

我有同样的问题,遵循相同的方法,在网站上你提到的。它应该这样工作,如果你有标准配置的网络。
只需禁用公共网络的防火墙。
我的问题很简单,Windows似乎将Docker创建的网络归类为公共网络,因此防火墙阻止了它,与此相同:
无法从Docker上运行的. net核心应用程序连接到SQL Server Express
它没有被标记为答案,而是在问题中编辑。

kmb7vmvb

kmb7vmvb5#

对我有效的是,将localhost更改为127.0.0.1。我不必禁用任何防火墙。

相关问题