Cha*_*ari 5 asp.net docker sql-server-2014-express asp.net-core
我有一个ASP.NET Core 2.2项目,为此我打开了docker支持。只要项目不需要数据库连接,项目就可以正常运行。例如,登录。输入用户凭据时,出现以下错误。
处理请求时发生未处理的异常。Win32Exception:连接尝试失败,因为一段时间后连接方未正确响应,或者建立连接失败,因为连接的主机未能响应
未知位置SqlException:建立与SQL Server的连接时发生与网络相关或特定于实例的错误。服务器未找到或无法访问。验证实例名称正确,并且已将SQL Server配置为允许远程连接。(提供者:TCP提供程序,错误:0-连接尝试失败,因为一段时间后连接方未正确响应,或者连接建立由于连接主机未能响应而失败。)
System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity身份,SqlConnectionString connectionOptions,对象providerInfo,布尔重定向用户实例,SqlConnectionString userConnectionOptions,SessionData reconnectSessionData,布尔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 /如何从内部docker连接到您的本地sql服务器-解决该问题。
我启用了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"
},
Run Code Online (Sandbox Code Playgroud)
如果我错过任何一步,请告诉我。我想从我的Docker项目连接到本地SQL
这花了我一些时间来解决,其中有许多可能是错误的小问题,这令人沮丧。由于自动生成的.net核心Web应用程序Visual Studio 2017项目无法立即使用,因此这可能会更加令人沮丧。将这种经验作为首次接触Docker的经验并不理想。
我最初也有一个错误的假设,即Docker映像将随容器内的SQL Server一起提供,不是这种情况,它试图访问必须预先安装在主机上的数据库服务器。
遵循的步骤(已针对Windows docker映像(而非Linux)进行了测试);
1)通过运行命令提示符并键入IPCONFIG来获取主机的IP地址
2)将appsettings.json文件中的数据库连接字符串设置为此IP地址,后跟SQL Server端口号,即;
192.168.XX,1433
3)将连接字符串设置为不使用Trusted_Connection(将其从连接字符串中删除)以及用户ID和密码中的硬代码;
用户ID = sa;密码= SuperSecurePassword;
如果不这样做,在某些SQL Server配置上,我将收到一个异常错误(无法完全记住具体信息!)
连接字符串显示如下所示;
“服务器= 192.168.XX,1433;数据库= MyDatabase;用户ID = sa;密码= SuperSecurePassword; MultipleActiveResultSets = true”
4)现在,您需要在主机上打开Windows防火墙,并为TCP端口1433添加新的入站连接规则。
5)完成所有操作后,仍然无法正常工作,请尝试重新启动;我挣扎了很长时间,不得不重新启动,这使它变得栩栩如生。我不确定Docker是否已正确初始化,但这主要是猜测!我并不是很想说重新启动是解决问题的方法,但这并不是真正的答案,但是在某些情况下,它可以解决问题。
编辑,最后一件事情,在管理员模式下运行Visual Studio(右键单击图标,“以管理员身份运行”)也有帮助。
为旧线程的复活而道歉,但这个问题似乎仍然存在,考虑到需要做的事情很少,可用的信息在如何解决此问题上有些不完整。
我遇到了同样的问题,并按照菲尔提到的所有步骤进行操作,但仍然无法解决这个问题。最后,除了指定答案中的步骤之外,我还必须按照以下步骤启用 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"
Run Code Online (Sandbox Code Playgroud)
所以对我有用的是:
public static string DockerHostMachineIpAddress => Dns.GetHostAddresses(new Uri("http://docker.for.win.localhost").Host)[0].ToString();
Run Code Online (Sandbox Code Playgroud)
docker.for.win.localhost是docker内部dns将解析为localhost的地址(不是docker内部的localhost,而是托管计算机)。上面的代码为u提供了您的本地主机的IP地址,并且您可以像这样创建连接字符串:
$"Server={DockerHostMachineIpAddress}\\SQL2017;Database=YourDB;User Id=Admin;Password=123;"
Run Code Online (Sandbox Code Playgroud)
如果您使用命名的sql服务器实例,则此方法将起作用-用您的实例名称替换SQL2017,并使用正确的用户替换密码。
然而!对于迁移和更新数据库,localhost可以正常工作。可能因为它不是从docker容器处理的。
编辑:
第二种解决方案比较干净,但是您需要一个支持docker-compose的项目。
在图像属性定义下方的服务定义中的docker-compose.yml文件中添加:
extra_hosts:
- "localhost:192.168.65.2"
Run Code Online (Sandbox Code Playgroud)
您仍然必须知道要为其添加别名的IP地址(可以使用原始答案找到该IP地址),但是一旦知道它就更干净了。在使用该IP的5台以上的不同机器上,这是正确的。
| 归档时间: |
|
| 查看次数: |
8483 次 |
| 最近记录: |