我有一个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如何将实例名称转换为端口号。有谁知道这是如何完成的以及它是否可以在客户端机器上配置?
答案 0 :(得分:4)
远程命名实例侦听端口发现依赖SQL Server Browser Service和协议。 由于您无法将此用于Linux docker镜像,我建议您通过显式指定端口并省略实例名称进行连接:"server=tcp:SQLSERVER1,1372;database=...;..."
:
要连接的SQL Server实例的名称或网络地址。可以在服务器名称后指定端口号:
server=tcp:servername, portnumber
BTW如果您使用实例名称,则在明确指定端口后,它应该没有任何区别。
PS。再次阅读问题后,问题是相关的,但不同的原因。通常,Linux容器可以发现Windows SQL Server,因为浏览器服务可能已启动并运行(证明3 envs。它有效)。在第四种环境中,它意味着阻碍发现的东西。浏览器服务已停止,或者FW(UDP 1433)中的浏览器发现协议侦听端口被阻止,或者UDP容器(或响应!)可能在容器和服务器之间的某处丢失。您可以调查并查找根本原因但,您也可以忽略该问题并通过明确指定端口解决问题,就像我展示的那样。