C# TFS 2015 API使用PowerShell从池中删除代理
我正在临时从池中删除代理,在代理所在的buildserver上安装新软件,测试它是否工作,然后再次将代理添加到池中 我希望通过编程实现这一点,或者使用PowerShell,或者如果不可能,那么使用C# 问题是,我找不到任何文档可以帮助我完成这项工作,无论是通过TFS REST API还是通过VisualStudio附带的工具 所以我特别要问: 如何从生成池中删除命名代理并 如何将命名代理添加回生成池 我基本上想要的功能与进入TFS的web管理和取消选中/检查池中的代理相同 当我尝试使用starain msft提供的信息启用/禁用代理时,出现以下错误:C# TFS 2015 API使用PowerShell从池中删除代理,c#,rest,powershell,tfs-2015,build-agent,C#,Rest,Powershell,Tfs 2015,Build Agent,我正在临时从池中删除代理,在代理所在的buildserver上安装新软件,测试它是否工作,然后再次将代理添加到池中 我希望通过编程实现这一点,或者使用PowerShell,或者如果不可能,那么使用C# 问题是,我找不到任何文档可以帮助我完成这项工作,无论是通过TFS REST API还是通过VisualStudio附带的工具 所以我特别要问: 如何从生成池中删除命名代理并 如何将命名代理添加回生成池 我基本上想要的功能与进入TFS的web管理和取消选中/检查池中的代理相同 当我尝试使用stara
Invoke-RestMethod :
404 - File or directory not found.
Server Error
后来我消除了大部分错误,因为我发现问题在于我公司的代理。
请看这里:
但我得到了starain msft的帮助
最终的解决方案如下所示:
Function TFSwebRequest {
param
(
[ValidateNotNullOrEmpty()]
[Parameter(Mandatory = $true)]
[string] $Uri,
[ValidateNotNullOrEmpty()]
[Parameter(Mandatory = $true)]
[string] $Method,
[ValidateNotNullOrEmpty()]
[string] $ContentType,
[ValidateNotNullOrEmpty()]
[string] $ContentBody,
[ValidateNotNullOrEmpty()]
[System.Net.WebHeaderCollection] $Headers
)
# Creating Webrequest from 'Uri'
$webRequest = [System.Net.HttpWebRequest]::CreateHttp($Uri)
$webRequest.UseDefaultCredentials = $true
$webRequest.Method = $Method
if ($Headers.Count -ne 0) {
$webRequest.Headers = $Headers
}
if (![string]::IsNullOrEmpty($ContentType)) {
$webRequest.ContentType = $ContentType
}
if (![string]::IsNullOrEmpty($ContentBody)) {
$Body = [byte[]][char[]]$ContentBody
$Stream = $webRequest.GetRequestStream();
$Stream.Write($Body, 0, $Body.Length);
}
# Get webresponse to a variable
try {
[System.Net.WebResponse]$webResponse = $webRequest.GetResponse()
}
catch {
$ErrorMessage = $_.Exception.Message
Write-Host "TFSwebRequest Failed = " $ErrorMessage -ForegroundColor Red
}
# Stream webresponse to a string
$webResponseStream = $webResponse.GetResponseStream()
$streamReader = New-Object System.IO.StreamReader $webResponseStream
$result = $streamReader.ReadToEnd() | ConvertFrom-Json
return ,$result
}
$agentUri = "http://teamfoundation:8080/tfs/Main/_apis/distributedtask/pools/$($poolID)/agents/$($agentID)?api-version=2.3-preview.1"
$contentBody = @"
{
"maxParallelism": 1,
"id": INSERTID,
"enabled": true #Or false
}
"@
$headers = New-Object System.Net.WebHeaderCollection
$headers.Add("X-HTTP-Method-Override", "PATCH")
TFSwebRequest -Uri $agentUri -Method "POST" -Headers $headers -ContentType "application/json" -ContentBody $contentBody
没有这样的API来创建代理或从代理池中删除代理。而且不需要自己编写脚本。下载代理时,只需以管理员身份运行命令提示符,然后在生成代理计算机上运行
ConfigureAgent.cmd
:
C:\Agent\ConfigureAgent.cmd
然后响应提示。检查代理池和代理的REST API: 获取代理池(请求方法:Get): 获取代理池的代理(请求方法:Get): 禁用/启用生成代理(请求方法:修补程序) 正文(
内容类型:application/json
)
从代理池中删除代理(请求方法:删除):
调用REST API(PowerShell)的简单示例:
另一方面,在将新软件安装到代理计算机后,需要重新启动生成代理才能识别它们。生成代理是作为服务运行还是以交互模式运行?我在回答中添加了powershell代码并禁用/启用生成代理REST API,你可以检查一下。你用我的解决方案解决了这个问题吗?除了禁用/启用代理之外,其他一切都很好。修补程序调用返回一个错误。检查我的编辑question@Setorica您请求的详细url、正文和内容类型是什么?您可以通过开发者工具网络跟踪捕获实际请求,然后通过PowerShell与您的请求进行比较。()。如何使用开发人员工具捕获该请求?@Setorica您可以参考本文:
http://[TFS URL]/_apis/distributedtask/pools?api-version=2.3-preview.1
http://[TFS URL]/_apis/distributedtask/pools/[pool id]/agents?api-version=2.3-preview.1
http://[TFS URL]/_apis/distributedtask/pools/[pool id]/agents/[agent id]?api-version=2.3-preview.1
{
"enabled": false,
"id": [agent id],
"maxParallelism": 1
}
http://[Tfs URL]/_apis/distributedtask/pools/[pool id]/agents/[agent id]?api-version=2.3-preview.1
Param(
[string]$vstsAccount = "<VSTS-ACCOUNT-NAME>",
[string]$projectName = "<PROJECT-NAME>",
[string]$buildNumber = "<BUILD-NUMBER>",
[string]$keepForever = "true",
[string]$user = "",
[string]$token = "<PERSONAL-ACCESS-TOKEN>"
)
# Base64-encodes the Personal Access Token (PAT) appropriately
$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $user,$token)))
$uri = "https://$($vstsAccount).visualstudio.com/DefaultCollection/$($projectName)/_apis/build/builds?api-version=2.0&buildNumber=$($buildNumber)"
$result = Invoke-RestMethod -Uri $uri -Method Get -ContentType "application/json" -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)}
String MyURI = "REST API URL";
WebRequest WReq = WebRequest.Create(MyURI);
WReq.Credentials =
new NetworkCredential("[user name]", "[password]", "[domain]");
WebResponse response = WReq.GetResponse();
Console.WriteLine(((HttpWebResponse)response).StatusDescription);
Stream dataStream = response.GetResponseStream();
StreamReader reader = new StreamReader(dataStream);
string responseFromServer = reader.ReadToEnd();
Console.WriteLine(responseFromServer);