【问题标题】:How does .NET Core on Linux determine what port a SQL Server instance listens on?Linux 上的 .NET Core 如何确定 SQL Server 实例侦听的端口?
【发布时间】:2017-11-03 20:49:51
【问题描述】:

我有一个 ASP.NET Core 1.1 Web API,它在 Ubuntu 上的 Docker 容器中运行,并连接到 Windows 服务器上的 SQL Server 数据库 (SQL Server 2012 SP3)。这适用于 4 个环境中的 3 个,但在一个环境中它无法连接到 SQL Server,我正在尝试对其进行故障排除。

错误是:

未处理的异常:System.Data.SqlClient.SqlException:建立与 SQL Server 的连接时发生与网络相关或特定于实例的错误。服务器未找到或无法访问。验证实例名称是否正确以及 SQL Server 是否配置为允许远程连接。 (提供者:TCP 提供者,错误:25 - 连接字符串无效)

SQL Server 有一个实例名称:SQLSERVER1\APPS。从 Linux 服务器我可以 ping 服务器 SQLSERVER1 和 telnet 到 SQLSERVER1 1372(1372 是 APPS 实例的端口:所以网络连接就在那里。

我能看到的唯一问题是 .NET Core 如何将实例名称转换为端口号。有谁知道这是如何完成的以及它是否可以在客户端机器上配置?

【问题讨论】:

    标签: sql-server docker asp.net-core .net-core


    【解决方案1】:

    远程命名实例侦听端口发现依赖于SQL Server Browser Service 和协议。 由于您无法将其用于您的 Linux docker 映像,我建议您通过显式指定端口并省略实例名称来连接:"server=tcp:SQLSERVER1,1372;database=...;...":

    要连接的 SQL Server 实例的名称或网络地址。服务器名后面可以指定端口号:server=tcp:servername, portnumber

    顺便说一句,如果您使用实例名称,那么在您明确指定端口后应该没有任何区别。

    PS。再次阅读问题后,问题是相关但不同的原因。通常,Linux 容器可以发现 Windows SQL Server,因为 Browser 服务可能已启动并正在运行(证明 3 个环境。它可以工作)。在第 4 种环境中,这意味着某些东西阻碍了发现。浏览器服务已停止,或者浏览器发现协议侦听端口在 FW 中被阻止(UDP 1433),或者 UDP 数据包(或响应!)可能在容器和服务器之间的某处丢失。您可以调查并找到根本原因,但是,您也可以忽略问题并通过...明确指定端口来解决问题,就像我展示的那样。

    【讨论】:

    • 谢谢,这有助于我的调试。 tcp: 前缀有效,但似乎不是必需的......但即使指定端口,我仍然无法从 Docker 容器连接。测试控制台应用程序使用来自 Docker 外部的相同连接字符串进行连接,因此这显然是 Docker 配置问题。现在有点难过。
    猜你喜欢
    • 2018-02-27
    • 2013-08-30
    • 2016-10-18
    • 2021-12-16
    • 2022-09-24
    • 2023-03-12
    • 1970-01-01
    • 2019-08-21
    • 1970-01-01
    相关资源
    最近更新 更多