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

C# TFS REST API.NET客户端,TFS2017,个人访问令牌:“;您必须在请求正文中传递有效的修补程序文档。”;,c#,.net,tfs,azure-devops-rest-api,C#,.net,Tfs,Azure Devops Rest Api,我使用Microsoft.VisualStudio.Services.Client连接到具有不同凭据的TFS/VST,以更新工作项 如果我在Premiss上连接到TFS2017并使用个人访问令牌(PAT),则工作项creatin更新会失败,原因是: 您必须在请求正文中传递有效的修补程序文档 所有的请求都可以正常工作 如果我连接到VST(即使使用PAT)以及使用NTLM凭据连接到TFS2017,同样的情况也会发生 通过Fiddler检查,问题似乎是,在这种情况下,TFS2017为每个请求发送一个身

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

如果我在Premiss上连接到TFS2017并使用个人访问令牌(PAT),则工作项creatin更新会失败,原因是:

您必须在请求正文中传递有效的修补程序文档

所有的请求都可以正常工作

如果我连接到VST(即使使用PAT)以及使用NTLM凭据连接到TFS2017,同样的情况也会发生

通过Fiddler检查,问题似乎是,在这种情况下,TFS2017为每个请求发送一个身份验证质询(对于VST,它只为第一个请求发送身份验证质询,然后只传递会话id)

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

我尝试过不同的身份验证方法,但都是一样的,GET请求可以工作(因此身份验证通常可以工作),但更新不起作用:

  • new-VssBasicCredential(string.Empty,pat)
  • 新的VssCredentials(新的WindowsCredential(新的NetworkCredential(string.Empty,pat)))
我认为它适用于VST,因为只有第一个(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。如果有人遇到同样的问题:个人访问令牌(PAT)似乎只能在连接安全的情况下使用(使用https),我希望这对您有所帮助。这在某种程度上是可以理解的,但从错误消息中并不总是清楚的。

Thx!我的工具在非交互式会话中运行,因此不能通过浏览器窗口登录。也许我的问题也与我以前没有考虑过的HTTP VS HTTPS有关。但是我需要建立一个测试环境来确保这一点。我希望你能做到这一点:我与微软确认,没有官方文档。这是github链接,其中Tingloo Huang(产品团队成员)已确认http中没有PAT: