此answer中提供的以下代码确实运行了一段时间,但现在它正在抛出 Microsoft.TeamFoundation.TeamFoundationServerUnauthorizedException:' TF30063:您无权访问https:// { mysite} .visualstudio.com /. 39; 再次。
var credentials = new VssClientCredentials();
credentials.PromptType = CredentialPromptType.PromptIfNeeded;
var teamProjects = new TfsTeamProjectCollection(tfsCollectionUri, credentials);
teamProjects.EnsureAuthenticated(); // exception thrown
问如何解决此问题?
更新奇怪,
teamProjects.EnsureAuthenticated();
之前,调试器会为PromptIfNeeded
读取credentials.PromptType
。DoNotPrompt
读取credentials.PromptType
。观察 上面的代码在控制台应用程序中运行良好,但无法在Windows窗体应用程序中工作(即抛出异常)。
Q1 如何让上述代码在Windows窗体应用程序中运行?
答案 0 :(得分:3)
如果你在Task
(即一个单独的线程)中执行上面的代码,它就可以了。如果凭据在注册表中的位置不存在或过时(请参阅此answer),则会打开一个窗口,您可以自行进行身份验证。
任何人都可以解释为什么会这样吗?
答案 1 :(得分:2)
VS已添加一个注册表项来存储凭据,尝试删除以下路径中的条目:
HKEY_CURRENT_USER \ SOFTWARE \微软\ VSCommon \ 14.0 \ ClientServices \ TokenStorage \ VisualStudio的\ VssApp
<强>更新强>
另外,请尝试下面的代码以查看它是否有效:
var credentials = new VssClientCredentials();
credentials.PromptType = CredentialPromptType.PromptIfNeeded;
credentials.Storage = new VssClientCredentialStorage(storageKind: "VssApp2", storageNamespace: "VisualStudio");
var aTeamProjects = new TfsTeamProjectCollection(new Uri("https://xxxxx.visualstudio.com/"), credentials);
aTeamProjects.EnsureAuthenticated();