WPF VSTS应用程序挂在VS凭据提示上
我正在尝试编写一个使用Visual Studio Team Service(VSTS)API的应用程序来显示Visual Studio Online中的项目。
我有以下代码在控制台应用程序中完美运行:
var connection = new VssConnection(new Uri(collectionUri), new VssClientCredentials()); using (var witClient = connection.GetClient()) { var wiql = new Wiql { Query = "SELECT [System.Id] FROM WorkItems WHERE State = 'New'" }; var workItems = await witClient.QueryByWiqlAsync(wiql); }
在控制台应用程序中,我收到一个Visual Studio提示输入凭据,一切都很好。 但是,当我从WPF运行相同的代码时,我没有得到提示,并且应用程序似乎挂起了。
在允许它从按钮单击事件异步运行后,我在WPF应用程序中工作了一小段时间。 然后我做了一些更改,几小时后 – 我一直无法得到它。 我按照CTRL + Z的方式回到它工作的地步,但仍然没有。 我怀疑这与线程管理有关,我已经尝试了使用Dispatcher.Invoke
并在Window_Loaded
运行或将其连接到一个按钮所能想到的一切。
我完全难过了。
我正在使用以下NuGet包:
PM> Install-Package Microsoft.TeamFoundationServer.ExtendedClient
您需要启动另一个线程来执行它(例如System.Threading.Tasks.Task.Run)。
例如:
private void button_Click(object sender, RoutedEventArgs e) { var workitem = System.Threading.Tasks.Task.Run(() => GetItems(123)).Result; } public WorkItem GetItems(int itemId) { var myCredentials = new VssClientCredentials(); var vstsConnection = new VssConnection(new Uri(@"https://XXX.visualstudio.com/"), myCredentials); var vstsClient = vstsConnection.GetClient(); var workItem = vstsClient.GetWorkItemAsync(itemId).Result; return workItem; }
另一方面,您可以直接在代码中指定帐户(可以让用户使用自定义登录窗口提供帐户)。
var u = new Uri("XXX"); VssCredentials c = new VssCredentials(new Microsoft.VisualStudio.Services.Common.WindowsCredential(new NetworkCredential("[user name]", "[password]"))); var connection = new VssConnection(u, c);
试试这个:
TfsClientCredentials tcc = new TfsClientCredentials(); tcc.AllowInteractive = true; TfsTeamProjectCollection ttpc = new TfsTeamProjectCollection(new Uri("https://xjsdal.visualstudio.com"), tcc); using (var witClient = ttpc.GetClient()) { var wiql = new Wiql { Query = "SELECT [System.Id] FROM WorkItems WHERE State = 'New'" }; var workItems = await witClient.QueryByWiqlAsync(wiql); }