Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Azure DevOps Services
Получение рабочих элементов с помощью запросов — это распространенный сценарий в Azure DevOps Services. В этой статье объясняется, как реализовать этот сценарий программным способом с помощью ИНТЕРФЕЙСов REST API или клиентских библиотек .NET.
Предварительные условия
Категория | Требования |
---|---|
Azure DevOps | - Организация.<\br>- Личный маркер доступа (PAT). |
среды разработки | Среда разработки C#. Вы можете использовать Visual Studio. |
Это важно
Мы используем личные маркеры доступа (PATS) в качестве примера в этой статье, но мы не рекомендуем использовать PATS. Дополнительные механизмы безопасной проверки подлинности см. в руководстве по проверке подлинности.
Создание проекта C# в Visual Studio
Дополнительные сведения о программировании C# в Visual Studio см. в документации по программированию Visual Studio C#.
Содержимое кода C#
В фрагменте кода выполняются следующие задачи:
-
Проверка подлинности
- Создайте учетные данные с помощью личного токена доступа (PAT).
- Создайте клиент с помощью учетных данных.
-
Получите рабочие элементы
- Создайте запрос, который вы хотите использовать.
- Получите результаты для этого запроса.
- Извлеките каждый из рабочих элементов по идентификатору.
Фрагмент кода на 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"]);
}
}
}
Устранение неполадок
При программной работе с Azure DevOps могут возникнуть проблемы, связанные с выполнением запросов, использованием параметров или перегрузками методов. В этом разделе приводятся рекомендации по общим проблемам, их причинам и их эффективному решению. Понимая эти действия по устранению неполадок, вы можете обеспечить более гладкую интеграцию и избежать ошибок среды выполнения.
Общие проблемы
-
Проблемы с инициализацией
Wiql
объекта: убедитесь, чтоWiql
объект корректно инициализирован и содержит допустимый запрос. - Неправильное использование необязательных параметров. Убедитесь, что необязательные параметры передаются правильно, особенно если они имеют значение NULL.
-
Недопустимый синтаксис запроса: убедитесь, что запрос в
Wiql
объекте действителен и соответствует ожидаемому формату.
RuntimeBinderException
При работе с методом QueryByWiqlAsync
в Azure DevOps может возникнуть RuntimeBinderException
проблема. Это исключение обычно возникает, когда аргументы, переданные методу, не соответствуют ни одной из ее перегрузк. Понимание сигнатуры метода и обеспечение правильного использования параметров может помочь устранить эту проблему.
Ошибка.
RuntimeBinderException
: это исключение возникает, когда аргументы, QueryByWiqlAsync
переданные методу, не соответствуют ни одной из перегрузок метода.
Решение.
Убедитесь, что параметры, передаваемые методу, имеют правильные типы и в правильном порядке. Сигнатура метода выглядит следующим образом:
public virtual Task<WorkItemQueryResult> QueryByWiqlAsync(
Wiql wiql,
bool? continueOnError = null,
int? top = null,
object userState = null,
CancellationToken cancellationToken = default(CancellationToken));
Пример кода с правильным использованием
В следующем фрагменте кода показано правильное использование QueryByWiqlAsync
метода, что гарантирует правильность определения параметров:
using Microsoft.TeamFoundation.WorkItemTracking.WebApi;
using Microsoft.TeamFoundation.WorkItemTracking.WebApi.Models;
using System;
using System.Threading.Tasks;
public async Task QueryWorkItemsAsync(WorkItemTrackingHttpClient client)
{
var wiql = new Wiql()
{
Query = "SELECT [System.Id] FROM WorkItems WHERE [System.TeamProject] = 'YourProjectName'"
};
try
{
var result = await client.QueryByWiqlAsync(wiql);
foreach (var workItem in result.WorkItems)
{
Console.WriteLine($"Work Item ID: {workItem.Id}");
}
}
catch (Microsoft.CSharp.RuntimeBinder.RuntimeBinderException ex)
{
Console.WriteLine($"Error: {ex.Message}");
}
}
Объяснение кода
-
Создать
Wiql
объект: ОбъектWiql
содержит запрос для получения рабочих элементов. -
Вызов
QueryByWiqlAsync
: передатьWiql
объект методу. -
Обработка исключений: ловить
RuntimeBinderException
и заносить сообщение об ошибке в журнал для отладки.
Следуя этому подходу, вы можете обеспечить надлежащее использование QueryByWiqlAsync
метода и избежать распространенных проблем, таких как RuntimeBinderException
.