我使用 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/