2017-06-02 48 views
1

我有一个ASP.NET Core 1.1 Web API,它在Ubuntu的Docker容器中运行,并连接到Windows服务器上的SQL Server数据库(SQL Server 2012 SP3)。这适用于4个out环境中的3个,但是在一个环境中,它无法连接到SQL Server,我试图对其进行故障排除。Linux上的.NET Core如何确定SQL Server实例侦听的端口?

的错误是:

Unhandled Exception: System.Data.SqlClient.SqlException: A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: TCP Provider, error: 25 - Connection string is not valid)

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

我可以看到问题出现的唯一空间是.NET核心翻译实例名称的端口号。有谁知道这是如何实现的,以及它是否是在客户机上配置?

回答

4

远程命名实例监听端口发现依赖SQL Server Browser Service和协议。 至于你能不能利用这个你Linux码头图像, 我建议你通过明确指定端口并省略实例名称来连接:"server=tcp:SQLSERVER1,1372;database=...;..."

The name or network address of the instance of SQL Server to which to connect. The port number can be specified after the server name: server=tcp:servername, portnumber

顺便说一句,如果你生活的实例名称,它应该没有什么区别后,你显式指定端口。

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

+0

谢谢,这有助于我的调试。 'tcp:'前缀可以工作,但似乎并不需要......但即使指定端口,我仍然无法从Docker容器连接。测试控制台应用程序使用来自Docker外部的相同连接字符串进行连接,所以显然是Docker配置问题。现在有点难倒了。 – Peter