c# - TFS REST API .NET 客户端,TFS2017,个人访问 token : "You must pass a valid patch document in the body of the request."

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

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

如果我在本地连接到 TFS2017 并使用个人访问 token (PAT),工作项创建更新会失败,并显示:

You must pass a valid patch document in the body of the request.

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

如果我连接到 VSTS(即使使用 PAT)以及使用 NTLM 凭据连接到 TFS2017,也会出现相同的情况。

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

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

我尝试过不同的身份验证方式,但都是一样的,GET 请求有效(因此身份验证一般有效),但更新无效:

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

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

关于如何让这个场景发挥作用的任何提示?

最佳答案

我现在使用 Microsoft.TeamfoundationServer.Client+Microsoft.AspNet.WebApi.Client 完成所有操作。 所有 TFS/VSTS 服务都有 HTTPClient。我曾经开发过自己的客户端,因为四月份图书馆还没有那么大。我记得在身份验证方面也遇到过同样的问题。我曾经使用以下方式登录:

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

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

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

它适用于 POST 和 GET。

我的设置是 TFS2015 和 VS2017。我希望这对您有所帮助

关于c# - TFS REST API .NET 客户端,TFS2017,个人访问 token : "You must pass a valid patch document in the body of the request.",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46602487/

相关文章:

c# - 来自 Windows 窗体应用程序的 ASP.NET 身份验证

.net - 与 ConfigurationProperty 属性一起使用时,属性类型的隐式约定是什么?

.net - 我注释掉了HTML代码,但是里面的控件没有被禁用

git - 在 TFS 2013 中将 TFS 项目转换为 Git 协议(protocol)

azure - Visual Studio 2013 和 Azure Web 应用程序

c# - 在 MTM 中运行测试用例时无法获取部署项的文件

c# - 从对象中获取 int 值

c# - 使用实际类而不是类副本的单元测试

c# - 通过c#线程上传大文件

c# - webmethod 无法使用 ajax