C#-Clientbibliotheksbeispiele
Azure DevOps Services | Azure DevOps Server 2022 | Azure DevOps Server 2019
In den folgenden Beispielen wird gezeigt, wie Sie Azure DevOps mithilfe der .NET-Clientbibliotheken erweitern und integrieren.
Beispiele in GitHub
Auf der .NET-Beispiel-GitHub-Seite finden Sie viele Beispiele mit Anweisungen zur Ausführung.
Weitere Beispiele
REST-Beispiele auf dieser Seite erfordern die folgenden NuGet-Pakete:
- Microsoft.TeamFoundationServer.Client
- Microsoft.VisualStudio.Services.Client
- Microsoft.VisualStudio.Services.InteractiveClient
Beispiel: Verwenden eines REST-basierten HTTP-Clients
// https://www.nuget.org/packages/Microsoft.TeamFoundationServer.Client/
using Microsoft.TeamFoundation.WorkItemTracking.WebApi;
using Microsoft.TeamFoundation.WorkItemTracking.WebApi.Models;
// https://www.nuget.org/packages/Microsoft.VisualStudio.Services.InteractiveClient/
using Microsoft.VisualStudio.Services.Client;
// https://www.nuget.org/packages/Microsoft.VisualStudio.Services.Client/
using Microsoft.VisualStudio.Services.Common;
/// <summary>
/// This sample creates a new work item query for New Bugs, stores it under 'MyQueries', runs the query, and then sends the results to the console.
/// </summary>
public static void SampleREST()
{
// Connection object could be created once per application and we use it to get httpclient objects.
// Httpclients have been reused between callers and threads.
// Their lifetime has been managed by connection (we don't have to dispose them).
// This is more robust then newing up httpclient objects directly.
// Be sure to send in the full collection uri, i.e. http://myserver:8080/tfs/defaultcollection
// We are using default VssCredentials which uses NTLM against an Azure DevOps Server. See additional provided
// Create a connection with PAT for authentication
VssConnection connection = new VssConnection(orgUrl, new VssBasicCredential(string.Empty, personalAccessToken));
// Create instance of WorkItemTrackingHttpClient using VssConnection
WorkItemTrackingHttpClient witClient = connection.GetClient<WorkItemTrackingHttpClient>();
// Get 2 levels of query hierarchy items
List<QueryHierarchyItem> queryHierarchyItems = witClient.GetQueriesAsync(teamProjectName, depth: 2).Result;
// Search for 'My Queries' folder
QueryHierarchyItem myQueriesFolder = queryHierarchyItems.FirstOrDefault(qhi => qhi.Name.Equals("My Queries"));
if (myQueriesFolder != null)
{
string queryName = "REST Sample";
// See if our 'REST Sample' query already exists under 'My Queries' folder.
QueryHierarchyItem newBugsQuery = null;
if (myQueriesFolder.Children != null)
{
newBugsQuery = myQueriesFolder.Children.FirstOrDefault(qhi => qhi.Name.Equals(queryName));
}
if (newBugsQuery == null)
{
// if the 'REST Sample' query does not exist, create it.
newBugsQuery = new QueryHierarchyItem()
{
Name = queryName,
Wiql = "SELECT [System.Id],[System.WorkItemType],[System.Title],[System.AssignedTo],[System.State],[System.Tags] FROM WorkItems WHERE [System.TeamProject] = @project AND [System.WorkItemType] = 'Bug' AND [System.State] = 'New'",
IsFolder = false
};
newBugsQuery = witClient.CreateQueryAsync(newBugsQuery, teamProjectName, myQueriesFolder.Name).Result;
}
// run the 'REST Sample' query
WorkItemQueryResult result = witClient.QueryByIdAsync(newBugsQuery.Id).Result;
if (result.WorkItems.Any())
{
int skip = 0;
const int batchSize = 100;
IEnumerable<WorkItemReference> workItemRefs;
do
{
workItemRefs = result.WorkItems.Skip(skip).Take(batchSize);
if (workItemRefs.Any())
{
// get details for each work item in the batch
List<WorkItem> workItems = witClient.GetWorkItemsAsync(workItemRefs.Select(wir => wir.Id)).Result;
foreach (WorkItem workItem in workItems)
{
// write work item to console
Console.WriteLine("{0} {1}", workItem.Id, workItem.Fields["System.Title"]);
}
}
skip += batchSize;
}
while (workItemRefs.Count() == batchSize);
}
else
{
Console.WriteLine("No work items were returned from query.");
}
}
}
Authentifizierung
Um die Authentifizierungsmethode für Azure DevOps zu ändern, ändern Sie den VssCredential-Typ, der beim Erstellen an VssConnection übergeben wurde.
Authentifizierung des persönlichen Zugriffstokens für REST-Dienste
public static void PersonalAccessTokenRestSample()
{
// Create instance of VssConnection using Personal Access Token
VssConnection connection = new VssConnection(orgUrl, new VssBasicCredential(string.Empty, personalAccessToken));
}
Visual Studio-Anmeldeaufforderung (Nur Microsoft-Konto oder Microsoft Entra-Back-End) für REST-Dienste (.NET Framework)
Da die .NET Core-Version keine interaktiven Dialogfelder unterstützt, gilt dieses Beispiel nur für die .NET Framework-Version der Clients.
public static void MicrosoftAccountRestSample()
{
// Create instance of VssConnection using Visual Studio sign-in prompt
VssConnection connection = new VssConnection(new Uri(collectionUri), new VssClientCredentials());
}
Microsoft Entra-Authentifizierung für REST-Dienste
public static void AADRestSample()
{
// Create instance of VssConnection using Azure AD Credentials for Azure AD backed account
VssConnection connection = new VssConnection(new Uri(collectionUri), new VssAadCredential(userName, password));
}
OAuth-Authentifizierung für REST-Dienste
Weitere Informationen finden Sie unter Azure DevOps-Authentifizierungsbeispiele und Microsoft Identity Platform und OAuth 2.0-Autorisierungscodefluss.
public static void OAuthSample()
{
// Create instance of VssConnection using OAuth Access token
VssConnection connection = new VssConnection(new Uri(collectionUri), new VssOAuthAccessTokenCredential(accessToken));
}