Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Azure DevOps Services
Pobieranie elementów roboczych przy użyciu zapytań jest typowym scenariuszem w usługach Azure DevOps Services. W tym artykule wyjaśniono, jak programowo zaimplementować ten scenariusz przy użyciu interfejsów API REST lub bibliotek klienckich platformy .NET.
Wymagania wstępne
Kategoria | Wymagania |
---|---|
Azure DevOps | - Organizacja.<\br>— osobisty token dostępu (PAT) . |
środowisko deweloperskie | Środowisko programistyczne języka C#. Możesz użyć programu Visual Studio. |
Ważne
Używamy osobistych tokenów dostępu (PATs) jako przykładu w tym artykule, ale nie zalecamy używania paTs. Aby uzyskać bardziej bezpieczne mechanizmy uwierzytelniania, zobacz wskazówki dotyczące uwierzytelniania .
Tworzenie projektu w języku C# w programie Visual Studio
Aby uzyskać informacje na temat programowania w języku C# w programie Visual Studio, zobacz dokumentację programowania w języku C#programu Visual Studio.
Zawartość kodu w języku C#
W fragmencie kodu występują następujące zadania:
-
Uwierzytelnianie
- Utwórz poświadczenia przy użyciu osobistego tokenu dostępu (PAT).
- Wygeneruj klienta przy użyciu poświadczeń.
-
Pobierz elementy robocze
- Utwórz zapytanie, którego chcesz użyć.
- Pobierz wyniki dla tego zapytania.
- Pobierz każdy z elementów roboczych na podstawie ich identyfikatorów.
Fragment kodu w języku C#
// nuget:Microsoft.TeamFoundationServer.Client
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.TeamFoundation.WorkItemTracking.WebApi;
using Microsoft.TeamFoundation.WorkItemTracking.WebApi.Models;
using Microsoft.VisualStudio.Services.Common;
using Microsoft.VisualStudio.Services.WebApi;
public class QueryExecutor
{
private readonly Uri uri;
private readonly string personalAccessToken;
/// <summary>
/// Initializes a new instance of the <see cref="QueryExecutor" /> class.
/// </summary>
/// <param name="orgName">
/// An organization in Azure DevOps Services. If you don't have one, you can create one for free:
/// <see href="https://go.microsoft.com/fwlink/?LinkId=307137" />.
/// </param>
/// <param name="personalAccessToken">
/// A Personal Access Token, find out how to create one:
/// <see href="/azure/devops/organizations/accounts/use-personal-access-tokens-to-authenticate?view=azure-devops" />.
/// </param>
public QueryExecutor(string orgName, string personalAccessToken)
{
this.uri = new Uri("https://dev.azure.com/" + orgName);
this.personalAccessToken = personalAccessToken;
}
/// <summary>
/// Execute a WIQL (Work Item Query Language) query to return a list of open bugs.
/// </summary>
/// <param name="project">The name of your project within your organization.</param>
/// <returns>A list of <see cref="WorkItem"/> objects representing all the open bugs.</returns>
public async Task<IList<WorkItem>> QueryOpenBugs(string project)
{
var credentials = new VssBasicCredential(string.Empty, this.personalAccessToken);
var wiql = new Wiql()
{
Query = "Select [Id] " +
"From WorkItems " +
"Where [Work Item Type] = 'Bug' " +
"And [System.TeamProject] = '" + project + "' " +
"And [System.State] <> 'Closed' " +
"Order By [State] Asc, [Changed Date] Desc",
};
using (var httpClient = new WorkItemTrackingHttpClient(this.uri, new VssCredentials(credentials)))
{
try
{
var result = await httpClient.QueryByWiqlAsync(wiql).ConfigureAwait(false);
var ids = result.WorkItems.Select(item => item.Id).ToArray();
if (ids.Length == 0)
{
return Array.Empty<WorkItem>();
}
var fields = new[] { "System.Id", "System.Title", "System.State" };
return await httpClient.GetWorkItemsAsync(ids, fields, result.AsOf).ConfigureAwait(false);
}
catch (Exception ex)
{
Console.WriteLine("Error querying work items: " + ex.Message);
return Array.Empty<WorkItem>();
}
}
}
/// <summary>
/// Execute a WIQL (Work Item Query Language) query to print a list of open bugs.
/// </summary>
/// <param name="project">The name of your project within your organization.</param>
/// <returns>An async task.</returns>
public async Task PrintOpenBugsAsync(string project)
{
var workItems = await this.QueryOpenBugs(project).ConfigureAwait(false);
Console.WriteLine("Query Results: {0} items found", workItems.Count);
foreach (var workItem in workItems)
{
Console.WriteLine(
"{0}\t{1}\t{2}",
workItem.Id,
workItem.Fields["System.Title"],
workItem.Fields["System.State"]);
}
}
}