我们正在TFS Online上运行构建和测试过程。这很好,直到我们尝试连接到外部服务。在我们的例子中是一个SQL数据库 关于我们应该嘲笑和不嘲笑的讨论在这种情况下并不真正有用,因为目前我们需要这样做。
我们也尝试过一个简单的ping,但即使这样也没有结束:
Test-Connection "172.217.18.100" #resolves to www.google.com
Testing connection to computer '172.217.18.100' failed: Error due to lack of resources
所以我们的印象是大多数外部IP / Ports /等。可能被锁定? 有没有办法打开它?如果是,怎么样?
我无法想象我们是第一个尝试这样的人?从网站下载内容,制作REST全部等等?应该有可能,不是吗?
更新1:
我们对此问题有一个更详细的问题here,但认为这是一个更通用的问题。
连接到Azure SQL时的错误消息是
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: Named Pipes Provider, error: 40 - Could not open a connection to SQL Server)`
但命名管道提供商部分具有误导性。如果您尝试连接到不存在的IP,也可以在本地获取此消息。
我们从C#NUnit测试中访问Azure SQL。
更新2:
我们从@ starain-MSFT中尝试了这个想法并安装了Azure SQL执行查询步骤/任务。安装工作正常,但它似乎错过了一个组件。见下图。
找不到具有以下功能的代理:azureps, sqlps,npm,node.js,msbuild,visualstudio,vstest
基于installed apps列表,我认为它是azureps。
解决方案(部分):
好的,所以我们一路走错了路。问题不在于防火墙(或任何防火墙)。问题是我们的app.config文件没有正确的设置。
我们在单元测试中的App.config文件设置与Web.config文件相同。每个都附加了App.Debug.config和App.Release.config文件。虽然这适用于Web应用程序,但这显然不适用于我们的单元测试
我们仍在寻找一个好的解决方案。
我找到了this solution on how to add a transform task inside Visual Studio,但这并不是我们正在搜索的内容,因为我们不需要在本地进行转换,只能在Visual Studio团队中进行转换。
app.config在Visual Studio团队中进行转换
所以,我想我们终于明白了。使用ConfigTransform,我们现在可以在构建过程中转换app.config文件。
答案 0 :(得分:2)
使用托管代理,需要从Internet访问SQL Server才能从托管代理连接到SQL Server。
处理这个问题的方法:
更新1:
请参阅此方法添加Azure SQL Server防火墙规则:
脚本:
param (
[string]$RestAddress,
[string]$Token,
[string]$RG,
[string]$Server
)
$basicAuth = ("{0}:{1}" -f 'test',$Token)
$basicAuth = [System.Text.Encoding]::UTF8.GetBytes($basicAuth)
$basicAuth = [System.Convert]::ToBase64String($basicAuth)
$headers = @{Authorization=("Basic {0}" -f $basicAuth)}
$result = Invoke-RestMethod -Uri $RestAddress -headers $headers -Method Get
Write-Host $result.value
New-AzureRmSqlServerFirewallRule -ResourceGroupName $RG -ServerName $Server -FirewallRuleName "UnitTestRule" -StartIpAddress "$($result.value)" -EndIpAddress "$($result.value)"
顺便说一句,您可以参考该脚本在测试后删除防火墙规则。
更新2:
SQL ConnectionString如下:
Server=tcp:[server name].database.windows.net,1433;Initial Catalog=sqlstarain1;Persist Security Info=False;User ID=[user name];Password=[password];MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;
答案 1 :(得分:1)
Windows托管构建代理不会阻止1433出站。
<connectionStrings>
<add name ="TestContext" providerName="System.Data.SqlClient"
connectionString="Server=tcp:[ServerName].database.windows.net,1433;Initial Catalog=[DB Name];Persist Security Info=False;User ID=[User];Password=[Password];MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;"/>
</connectionStrings>
那就是它。我刚刚用EF,SQL Azure&amp; amp; VSTS托管代理,它工作。
答案 2 :(得分:0)
我假设您正在使用托管代理,这意味着该计算机是许多VSTS帐户(租户)之间的共享资源,并由Microsoft管理(并锁定)。
您可以在自己的虚拟机上轻松安装代理并在那里运行构建。 VM可以在云端或内部部署,您的选择。您可以通过简单和便宜的方式进行全面控制。
更新: 托管代理允许HTTP(S)呼叫,这涵盖了很多理由。虽然有用,但我认为它不能解决连接到SQL数据库的原始问题。