我有一个应用程序应该使用命名实例连接到在远程服务器上运行的 SQL Server。
使用 IISExpress,我可以连接到 SQL Server,但是从 Docker(Linux 容器)它失败了 - 在访问上下文时它只是挂起 - 没有抛出异常或错误消息。例如。
var context = serviceScope.ServiceProvider.GetService<AppContext>();
context.Users.ToList();
在调试器中,它永远不会到达异常处理程序。
相反,我看到很多这样的输出:
The thread 125 has exited with code 0 (0x0).
The thread 164 has exited with code 0 (0x0).
The thread 0xa4 has exited with code 0 (0x0).
使用 node.js 我什至可以从 docker 连接到 SQL Server 没有问题。
当我使用例如时,我可以从 Docker 中的 ASP.NET Core 连接到与 Docker 在同一台机器上运行的 SQL Server Developer 版本[ipaddress or host.docker.internal],1433 - 不幸的是在远程 SQL Server 上,我无法配置固定端口。
连接字符串:
"Data Source=remoteIP\\WEBDB;Initial Catalog=TestDB;User ID=testuser;Password=******;"
也试过“集成安全=假;”在连接字符串中
服务器身份验证设置为混合
我也可以在没有 Entity Framework 的情况下重现这一点:
var conString = "Data Source=remoteIP\\WEBDB;Initial Catalog=TestDB;Integrated Security=False;User ID=testuser;Password=********";
using (SqlConnection conn = new SqlConnection(conString))
using (SqlCommand cmd = new SqlCommand("SELECT * FROM Users", conn))
{
conn.Open();
var rows = cmd.ExecuteNonQuery();
Console.WriteLine($"rows: {rows}");
}
它将卡在
conn.Open();
线上。知道我能做什么吗?
更新:
编辑
这有效:
var conString = "Data Source=10.0.75.1,1433;Initial Catalog=TestDB;Integrated Security=False;User ID=testuser;Password=********";
这不起作用:
var conString = "Data Source=10.0.75.1\\Developer;Initial Catalog=TestDB;Integrated Security=False;User ID=testuser;Password=********";
我可以 ping 远程 IP 地址以及远程服务器名称。
不幸的是,由于缺少依赖项,在 ubuntu 镜像上安装 mssql-cli 失败。
最佳答案
Data Source
是错误的。命名实例仅使用一个反斜杠。正确的来源是:
remoteIP\WEBDB
反斜杠 needs to be escaped 仅当字符串存储在需要这种转义的介质中时,例如在 C# 字符串或 JSON 字符串中。对于 C#、JSON、Javascript 和 C++ 相关的语言,转义字符是反斜杠本身,例如:
var connectionString="Data Source=remoteIP\\WEBDB;Initial Catalog=TestDB;User ID=testuser;Password=******;"
或者
{
"ConnectionStrings": {
"BloggingDatabase": "Server=(localdb)\\mssqllocaldb;Database=EFGetStarted.ConsoleApp.NewDb;Trusted_Connection=True;"
},
}
文字 C# 字符串、XML 或 INI 文件不需要转义。以下 C# 行不需要转义。
var connectionString=@"Data Source=remoteIP\WEBDB;Initial Catalog=TestDB;User ID=testuser;Password=******;"
编辑
修复名称只是可能出错的一件事。当 DNS 尝试将无法识别的字符串解析为有效 IP 时,错误的地址很容易传递给应用程序。
另一个问题是 docker 容器默认没有网络连接。您必须指定它们可以连接到什么以及如何将内部 IP 和端口映射到外部 IP 和端口。
您可以使用 SQL Server CLI 工具 mssql-cli 来测试与服务器的连接,而无需运行您自己的应用程序:
mssql-cli -S InternallyMappedIP\WEBDB -d TestDB -U testuser
关于c# - 无法从 Docker (Linux) 中运行的 ASP.NET Core 连接到 SQL Server 命名实例,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56473656/