TFS REST API .NET客户端,TFS2017,个人访问令牌:“您必须在请求正文中传递有效的补丁文档。”

时间:2017-10-06 09:23:01

标签: c# .net tfs tfs2017 azure-devops-rest-api

我使用Microsoft.VisualStudio.Services.Client连接到具有不同凭据的TFS / VSTS,以便更新工作项。

如果我在故事前连接到TFS2017并使用个人访问令牌(PAT),则工作项创新更新将失败,并显示:

  

您必须在请求正文中传递有效的补丁文档。

所有GET请求都可以正常工作。

如果我连接到VSTS(即使使用PAT)以及使用NTLM凭据连接到TFS2017时,同样的方案也可以。

用Fiddler检查,问题似乎是,对于这种情况,TFS2017会为每个请求发送一个身份验证质询(对于VSTS,它只发送第一个请求,然后只传入会话ID)。

.NET客户端将正确的补丁文档作为第一个POST / PATCH请求的内容发送,但在响应身份验证质询时不再包含该内容。因此第二个请求的内容为空,这会触发“您必须在请求正文中传递有效的补丁文档”。在末尾。

我已尝试使用不同的身份验证方式,但它完全相同,GET请求正常工作(因此auth通常可以正常工作),但不更新:

  • new VssBasicCredential(string.Empty, pat)
  • new VssCredentials(new WindowsCredential(new NetworkCredential(string.Empty, pat)))

我认为它适用于VSTS,因为仅针对第一个(GET)请求存在身份验证质询,而不是稍后针对POST / PATCH请求的身份验证质询。

有关如何使此方案有效的任何提示?

2 个答案:

答案 0 :(得分:2)

我现在使用Microsoft.TeamfoundationServer.Client + Microsoft.AspNet.WebApi.Client执行所有操作。 所有TFS / VSTS服务都有HTTPClients。我曾经开发自己的客户,因为图书馆在4月份没那么大。我记得有一些与身份验证相同的问题。我曾经登录过:

credentials = new VssCredentials(useDefaultCredentials: true);
connection = new VssConnection(new Uri(uriString), credentials);

我曾经从连接中获取HttpMessageHandler,依此类推。获得正确身份验证的线索是首先通过VS或浏览器登录。

另一种方法是在HttpClient中提供正确的身份验证。

它适用于POST和GET。

我的设置是TFS2015和VS2017。我希望这能以某种方式帮助你

答案 1 :(得分:0)

记录下来,如果有人遇到相同的问题:似乎只能使用个人访问令牌(PAT),连接是安全的(使用https)。这在某种程度上是可以理解的,但是从错误消息中并不能始终清除。