亲爱的
请帮助我解决VS外接Tfs连接问题。
我编写了VS 2017插件,该插件使用TfsTeamProjectCollection类连接到tfs服务器。 Tfs服务器托管在https://dev.azure.com
中但是,在某些计算机上,它无法连接到Tfs服务器。 例如,我尝试重现此问题,并清除了所有描述为here的缓存。清除/连接几个周期后,我得到了以下信息:
这是我用来连接的源代码:
public override TfsTeamProjectCollection CreateCollection(WorkspaceInfo wi)
{
var s = (overrideConfig ?? Config);
var u = wi.ServerUri;
var vssCred = new VssClientCredentials(); // GetCredentials(s.Vsts);
Logger.Debug("getting collection for url:{0}", u);
TfsTeamProjectCollection tpc = null;
try
{
tpc = new TfsTeamProjectCollection(u, vssCred);
Logger.Debug("authenticating");
tpc.Authenticate(); // 401 non authorized exception here
}
我尝试在vssCred.Storage = new VssClientCredentialStorage();
之前添加Autheticate()
,但是没有运气
然后,我已经使用Fiddler应用程序检查了网络数据包。 它显示了使用单元测试,控制台应用程序和加载项发送的相同请求数据包。 但是控制台应用程序和单元测试会产生初始请求
开机自检 https://dev.azure.com/quipu-cwnet/Services/v3.0/LocationService.asmx HTTP / 1.1
响应为
HTTP / 1.1 401未经授权
X-TFS-FedAuthRedirect: https://app.vssps.visualstudio.com/_signin?realm=dev.azure.com&reply_to=https%3A%2F%2Fdev.azure.com%2F ...
然后,控制台和单元测试将数据包发送到重定向URL,并询问用户凭据。
当加载项尝试连接到Tfs服务器时,提琴手仅显示第一个POST请求和401响应(具有相同的X-TFS-FedAuthRedirect标头。但是没有重定向。从用户端看来,应用程序冻结了一些获得401响应后的时间,然后失败,并出现401错误。
单元测试和加载项程序集对15.0.0程序集的引用相同,例如Microsoft.TeamFoundation.VersionControl.Client和相关程序。
我尝试过VssConnection,但还是一样
VssConnection connection = new VssConnection(u, vssCred);
connection.ConnectAsync().SyncResult();
var prj = connection.GetClient<ProjectHttpClient>();
var prjCollection = prj.GetProjects().Result; // 401 error here when is executed as VS add-in
foreach (var pc in prjCollection)
Logger.Debug("\tVssConnection project {0} {1}", pc.Id, pc.Name);
我正在使用同一用户来启动VS(和加载项)和控制台。没有提升的权限。
用作VS外接程序时,TfsConnection有什么可以做的吗?
答案 0 :(得分:0)
the answer将在单独的线程(非GUI)中执行Authenticate()
:crazy
var authTask = Task.Run(() => tpc.Authenticate());
authTask.Wait();
请注意,我正在使用VS 2017 15.9.11和Microsoft.TeamFoundationServer.ExtendedClient.15.112.1
upd1:我已经将Microsoft.TeamFoundationServer.ExtendedClient升级到15.113.1 它可以在我的机器上工作,但在我的同事机器上仍然无法工作。
Tfs凭证在两台计算机上都像超级按钮一样工作:
var tfsClientCredentials = TfsClientCredentials.LoadCachedCredentials(wi.ServerUri, false, false);
var res = new TfsTeamProjectCollection(wi.ServerUri, tfsClientCredentials);
res.EnsureAuthenticated();
尽管已将其标记为过时。