我们使用Visual Studio Online托管的构建服务器来自动化构建过程。作为其中的一部分,我正在考虑将单元和集成测试添加到此过程中。
这些测试需要访问我们的SQL Azure数据库(其中两个在同一台服务器上),而这又需要通过数据库服务器的防火墙进行访问。
我有一个PowerShell脚本,它使用New-AzureRmSqlServerFirewallRule
向数据库服务器添加IP地址,这些防火墙规则已成功显示在Azure门户中。
具体来说,该脚本为:
添加了防火墙规则Get-NetIPAddress
返回)结合使用时,似乎会自动添加预定义的 AllowAllAzureIPs 和 AllowAllWindowsAzureIps 规则。
但是,测试随后失败,例外情况为:
System.Data.SqlClient.SqlException: System.Data.SqlClient.SqlException:与网络相关或 建立连接时发生特定于实例的错误 SQL Server。服务器未找到或无法访问。校验 实例名称正确且SQL Server配置为 允许远程连接。 (提供者:命名管道提供商,错误:40 - 无法打开与SQL Server的连接)
我不确定为什么构建服务器无法访问数据库服务器 - 可能是测试进程的主机使用的是不同的IP地址吗?
更新
正如已经指出的那样,异常消息提到"命名管道提供商"这表明数据库连接使用的是命名管道而不是IP / TCP连接。为了测试这一点,我更改了本地app.config以包含一个未知/随机/不可访问的IP并在本地运行测试(否则它们在本地成功运行):我收到完全相同的异常消息提及"命名管道提供商" 。也许在某种程度上ReliableSqlConnection类解析为命名管道,但我的观点是,我可以通过在我的数据库连接字符串中更改为未知或无法访问的IP地址来引发同样的异常。
此外,数据库连接字符串以tcp:
开头,Test-Connection "172.217.18.100" #resolves to www.google.com
根据this blog post明确告知连接使用TCP / IP和不命名管道。
我还修改了防火墙规则以允许所有IP地址(0.0.0.0到255.255.255.255)但仍然抛出相同的异常。这表明SQL Azure防火墙规则不是“阻塞”的原因。
因此我的怀疑转向网络访问被阻止(尽管可能存在白名单以允许构建服务器到达代码存储库)。我在构建过程的开始添加了一个非常简单的PowerShell脚本:
New-AzureRmSqlServerFirewallRule
这导致
测试与计算机的连接' 172.217.18.100'失败:由于缺乏资源而导致错误
是否禁用了构建服务器ping / ICMP或是否阻止了所有传出流量?
*该脚本仅考虑IPv4地址,因为我在将IPv6地址传递给{{1}}方面没有取得任何成功。
答案 0 :(得分:1)
我们终于解决了这个问题。这个问题与防火墙无关。问题是我们的单元测试中的app.config文件没有经过我们的web.config文件所做的转换步骤。因此,所有设置都来自我们的本地开发,因此是错误的。
更多相关信息:
Connect to external services inside Visual Studio Online build/test task
答案 1 :(得分:0)
您使用的是什么连接字符串?您的错误似乎表明这不是真正的防火墙问题,而是正在尝试连接到不存在的服务器。
我的*错误*假设现在是你的连接字符串只包含服务器名称,没有.database.windows.net后缀,导致客户端驱动程序在本地网络上查找服务器。提供的错误似乎与防火墙无关。
(编辑以反映作者的反馈。)
答案 2 :(得分:0)
如果您通过TCP进行连接,那么为什么您的错误消息显示 Named Pipes ?
[...]
(提供商:命名管道提供程序,错误:40 - 无法打开与SQL Server的连接)
我首先要研究这个悖论。
防火墙测试非常简单,允许0.0.0.0
到255.255.255.255
或0.0.0.0/0
并重新测试。我的钱也出现了同样的错误信息。