我们使用Visual Studio Online托管的构建服务器来自动化我们的构建过程。作为其中的一部分,我正在研究将单元测试和集成测试添加到此过程中。
这些测试需要访问我们的SQL Azure数据库(其中有2个,都在同一个服务器上),这又需要通过DB服务器的防火墙进行访问。
我有一个PowerShell脚本,使用
具体而言,该脚本会为以下内容添加防火墙规则:
然而,测试随后失败,并出现异常:
System.Data.SqlClient.SqlException: System.Data.SqlClient.SqlException: 在建立与 SQL Server 的连接时发生与网络相关或特定于实例的错误。找不到服务器或无法访问。请验证实例名称是否正确,并且 SQL Server 配置为允许远程连接。(提供程序: Named Pipes Provider, 错误: 40 - 无法打开到 SQL Server 的连接)
我不确定为什么构建服务器无法连接到数据库服务器- 是否是测试进程的主机使用了不同的 IP 地址? 更新
正如所指出的,异常消息提到了“Named Pipes Provider”,这表明DB连接使用的是命名管道而不是IP/TCP连接。为了测试这一点,我将本地app.config更改为包含一个未知/随机/不可访问的IP,并在本地运行测试(否则测试在本地成功运行):我收到了完全相同的异常消息,提到“Named Pipes Provider”。也许在某个级别上ReliableSqlConnection类会解析为命名管道,但我的观点是,通过在我的DB连接字符串中更改为未知或不可访问的IP地址,我可以引发完全相同的异常。
因此,我的怀疑转向被阻止的网络访问(尽管白名单可能存在以允许构建服务器访问代码库)。我在构建过程的开头添加了一个非常简单的PowerShell脚本:
这些测试需要访问我们的SQL Azure数据库(其中有2个,都在同一个服务器上),这又需要通过DB服务器的防火墙进行访问。
我有一个PowerShell脚本,使用
New-AzureRmSqlServerFirewallRule
向DB服务器添加IP地址,这些防火墙规则在Azure门户中成功显示。具体而言,该脚本会为以下内容添加防火墙规则:
- 构建服务器上的所有IPv4地址*(由
Get-NetIPAddress
返回) - 构建服务器的外部IP地址(由https://api.ipify.org返回)
然而,测试随后失败,并出现异常:
System.Data.SqlClient.SqlException: System.Data.SqlClient.SqlException: 在建立与 SQL Server 的连接时发生与网络相关或特定于实例的错误。找不到服务器或无法访问。请验证实例名称是否正确,并且 SQL Server 配置为允许远程连接。(提供程序: Named Pipes Provider, 错误: 40 - 无法打开到 SQL Server 的连接)
我不确定为什么构建服务器无法连接到数据库服务器- 是否是测试进程的主机使用了不同的 IP 地址? 更新
正如所指出的,异常消息提到了“Named Pipes Provider”,这表明DB连接使用的是命名管道而不是IP/TCP连接。为了测试这一点,我将本地app.config更改为包含一个未知/随机/不可访问的IP,并在本地运行测试(否则测试在本地成功运行):我收到了完全相同的异常消息,提到“Named Pipes Provider”。也许在某个级别上ReliableSqlConnection类会解析为命名管道,但我的观点是,通过在我的DB连接字符串中更改为未知或不可访问的IP地址,我可以引发完全相同的异常。
此外,DB连接字符串以tcp:
开头,根据this blog post,明确告诉连接要使用TCP/IP,而不是命名管道。
因此,我的怀疑转向被阻止的网络访问(尽管白名单可能存在以允许构建服务器访问代码库)。我在构建过程的开头添加了一个非常简单的PowerShell脚本:
Test-Connection "172.217.18.100" #resolves to www.google.com
这导致
连接到计算机“172.217.18.100”的测试失败:由于资源不足而出现错误
构建服务器禁用了ping / ICMP或所有出站流量都被阻止吗?
*该脚本仅考虑IPv4地址,因为我在传递IPv6地址给New-AzureRmSqlServerFirewallRule
时没有成功。