我有一个应用程序应该使用命名实例连接到在远程服务器上运行的 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 上,我无法配置固定端口。
  • 使用 IISExpress 工作(所以在 Windows 上运行)
  • 在使用固定端口而不是命名实例连接到在开发机器上运行的 SQL Server 时起作用(但我无法更改我们的生产服务器)
  • 在使用 node.js 时有效!来自 docker 也带有命名实例(两者:带有主机名或 IP 地址 - 所以我可以解析远程名称,防火墙不是问题)
  • 尝试使用 Microsoft 容器作为基础的 ASP.NET Core 2.2 和 3.0preview5,例如从 mcr.microsoft.com/dotnet/core/aspnet:3.0-buster-slim AS base

  • 连接字符串:
    "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/

    10-16 23:49
    查看更多