Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Azure DevOps Services | Azure DevOps Server | Azure DevOps Server 2022
Waarschuwing
Verouderde technologie - moderne alternatieven aanbevolen
Deze SOAP-clients zijn verouderde technologie en mogen alleen worden gebruikt voor:
- Bestaande toepassingen onderhouden die niet kunnen worden gemoderniseerd
- .NET Framework-toepassingen waarvoor SOAP-specifieke functionaliteit is vereist
Voor nieuwe ontwikkeling gebruikt u de moderne op REST gebaseerde .NET-clientbibliotheken die het volgende bieden:
- ✅ Betere prestaties en betrouwbaarheid
- ✅ Ondersteuning voor .NET Core, .NET 5+ en .NET Framework
- ✅ Moderne verificatiemethoden (beheerde identiteiten, service-principals)
- ✅ Async/await gebruikspatronen en moderne C#-functies
- ✅ Actieve ontwikkeling en ondersteuning
Dit artikel bevat voorbeelden voor integratie met Azure DevOps Server en Azure DevOps Services met behulp van verouderde SOAP-clients. Deze clients zijn alleen beschikbaar in de .NET Framework-versie en vereisen plaatselijke of verouderde verificatiemethoden.
Vereisten en beperkingen
Vereisten:
- .NET Framework 4.6.1 of hoger
- Verouderde NuGet-pakketten
- Windows-omgeving voor SOAP-clientondersteuning
Beperkingen:
- ❌ Geen ondersteuning voor .NET Core of .NET 5+
- ❌ Beperkte opties voor moderne verificatie
- ❌ Geen async/await-patronen
- ❌ Verminderde prestaties vergeleken met REST-clients
- ❌ Beperkte toekomstige ondersteuning en updates
Vereiste NuGet-pakketten:
- Microsoft.TeamFoundationServer.ExtendedClient - Verouderde SOAP-clients
- Microsoft.TeamFoundationServer.Client - Core Azure DevOps-API's
- Microsoft.VisualStudio.Services.Client - Verbinding en verificatie
- Microsoft.VisualStudio.Services.InteractiveClient - Interactieve verificatiestromen
Migratierichtlijnen
Aanbevolen migratiepad
Stap 1: Uw huidige gebruik evalueren
- SOAP-specifieke functionaliteit identificeren die uw toepassing gebruikt
- Bepalen of equivalente REST API's beschikbaar zijn
- Verificatievereisten evalueren
Stap 2: Migratiestrategie plannen
- Onmiddellijk: Verificatie bijwerken om PAT's of Microsoft Entra-id te gebruiken
- Korte termijn: Migreren naar OP REST gebaseerde clients terwijl .NET Framework behouden blijft
- Lange termijn: moderniseren naar .NET Core/.NET 5+ met REST-clients
Stap 3: Migratie implementeren
- Begin met verificatie-updates. Bekijk de volgende voorbeelden.
- SOAP-clients incrementeel vervangen door REST-equivalenten
- Test grondig voordat u naar productie uitrolt
Zie voorbeelden van .NET-clientbibliotheek voor gedetailleerde migratierichtlijnen.
Voorbeelden van verouderde SOAP-clients
Basisgebruik van SOAP-client
Belangrijk
In dit voorbeeld ziet u alleen verouderde patronen voor verwijzing. Gebruik op REST gebaseerde voorbeelden voor nieuwe ontwikkeling.
using Microsoft.TeamFoundation.Client;
using Microsoft.TeamFoundation.WorkItemTracking.Client;
using Microsoft.VisualStudio.Services.Common;
using System;
using System.Linq;
/// <summary>
/// Legacy SOAP client example - use REST clients for new development
/// Creates a work item query, runs it, and displays results
/// </summary>
public static class LegacySoapExample
{
public static void ExecuteWorkItemQuery(string collectionUri, string teamProjectName, VssCredentials credentials)
{
try
{
// Create TfsTeamProjectCollection instance with credentials
using (var tpc = new TfsTeamProjectCollection(new Uri(collectionUri), credentials))
{
// Authenticate the connection
tpc.Authenticate();
// Get the WorkItemStore service (SOAP-based)
var workItemStore = tpc.GetService<WorkItemStore>();
// Get the project context
var workItemProject = workItemStore.Projects[teamProjectName];
// Find 'My Queries' folder
var myQueriesFolder = workItemProject.QueryHierarchy
.OfType<QueryFolder>()
.FirstOrDefault(qh => qh.IsPersonal);
if (myQueriesFolder != null)
{
const string queryName = "Legacy SOAP Sample";
// Check if query already exists
var existingQuery = myQueriesFolder
.OfType<QueryDefinition>()
.FirstOrDefault(qi => qi.Name.Equals(queryName, StringComparison.OrdinalIgnoreCase));
QueryDefinition queryDefinition;
if (existingQuery == null)
{
// Create new query with proper WIQL
queryDefinition = new QueryDefinition(
queryName,
@"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'
ORDER BY [System.CreatedDate] DESC");
myQueriesFolder.Add(queryDefinition);
workItemProject.QueryHierarchy.Save();
}
else
{
queryDefinition = existingQuery;
}
// Execute the query
var workItems = workItemStore.Query(queryDefinition.QueryText);
Console.WriteLine($"Found {workItems.Count} work items:");
foreach (WorkItem workItem in workItems)
{
var title = workItem.Fields["System.Title"].Value;
var state = workItem.Fields["System.State"].Value;
Console.WriteLine($"#{workItem.Id}: {title} [{state}]");
}
if (workItems.Count == 0)
{
Console.WriteLine("No work items found matching the query criteria.");
}
}
else
{
Console.WriteLine("'My Queries' folder not found.");
}
}
}
catch (Exception ex)
{
Console.WriteLine($"Error executing SOAP query: {ex.Message}");
throw;
}
}
}
Legacy-verificatiemethoden
Waarschuwing
Deze verificatiemethoden hebben beveiligingsbeperkingen. Migreer indien mogelijk naar moderne verificatie .
Verificatie van persoonlijke toegangstokens (niet aanbevolen)
/// <summary>
/// Authenticate SOAP client using Personal Access Token
/// Most secure option for legacy SOAP clients
/// </summary>
public static void AuthenticateWithPAT(string collectionUri, string personalAccessToken)
{
try
{
var credentials = new VssBasicCredential(string.Empty, personalAccessToken);
using (var tpc = new TfsTeamProjectCollection(new Uri(collectionUri), credentials))
{
tpc.Authenticate();
Console.WriteLine($"Successfully authenticated to: {tpc.DisplayName}");
Console.WriteLine($"Instance ID: {tpc.InstanceId}");
}
}
catch (Exception ex)
{
Console.WriteLine($"PAT authentication failed: {ex.Message}");
throw;
}
}
Microsoft Entra-verificatie (beperkte ondersteuning)
/// <summary>
/// Microsoft Entra authentication for SOAP services
/// Limited to specific scenarios - prefer REST clients for modern auth
/// </summary>
public static void AuthenticateWithEntraID(string collectionUri)
{
try
{
// Note: Limited authentication options compared to REST clients
var credentials = new VssAadCredential();
using (var tpc = new TfsTeamProjectCollection(new Uri(collectionUri), credentials))
{
tpc.Authenticate();
Console.WriteLine($"Successfully authenticated with Microsoft Entra ID");
Console.WriteLine($"Collection: {tpc.DisplayName}");
}
}
catch (Exception ex)
{
Console.WriteLine($"Microsoft Entra authentication failed: {ex.Message}");
Console.WriteLine("Consider migrating to REST clients for better authentication support.");
throw;
}
}
Interactieve verificatie (alleen.NET Framework)
/// <summary>
/// Interactive authentication with Visual Studio sign-in prompt
/// Only works in .NET Framework with UI context
/// </summary>
public static void AuthenticateInteractively(string collectionUri)
{
try
{
var credentials = new VssClientCredentials();
using (var tpc = new TfsTeamProjectCollection(new Uri(collectionUri), credentials))
{
tpc.Authenticate();
Console.WriteLine($"Interactive authentication successful");
Console.WriteLine($"Authenticated user: {tpc.AuthorizedIdentity.DisplayName}");
}
}
catch (Exception ex)
{
Console.WriteLine($"Interactive authentication failed: {ex.Message}");
Console.WriteLine("Ensure application has UI context and user interaction is possible.");
throw;
}
}
Verificatie van gebruikersnaam/wachtwoord (afgeschaft)
Waarschuwing
Verificatie van gebruikersnaam/wachtwoord is afgeschaft en onveilig. Gebruik in plaats daarvan PAT's of moderne verificatiemethoden.
/// <summary>
/// Username/password authentication - DEPRECATED AND INSECURE
/// Only use for legacy on-premises scenarios where no alternatives exist
/// </summary>
[Obsolete("Username/password authentication is deprecated. Use PATs or modern authentication.")]
public static void AuthenticateWithUsernamePassword(string collectionUri, string username, string password)
{
try
{
var credentials = new VssAadCredential(username, password);
using (var tpc = new TfsTeamProjectCollection(new Uri(collectionUri), credentials))
{
tpc.Authenticate();
Console.WriteLine("Username/password authentication successful (DEPRECATED)");
}
}
catch (Exception ex)
{
Console.WriteLine($"Username/password authentication failed: {ex.Message}");
Console.WriteLine("This method is deprecated. Please migrate to PATs or modern authentication.");
throw;
}
}
Verouderd voorbeeld voltooien
using Microsoft.TeamFoundation.Client;
using Microsoft.TeamFoundation.WorkItemTracking.Client;
using Microsoft.VisualStudio.Services.Common;
using System;
using System.Configuration;
/// <summary>
/// Complete example showing legacy SOAP client usage
/// For reference only - use REST clients for new development
/// </summary>
class LegacySoapProgram
{
static void Main(string[] args)
{
try
{
// Get configuration (prefer environment variables or secure config)
var collectionUri = ConfigurationManager.AppSettings["CollectionUri"];
var projectName = ConfigurationManager.AppSettings["ProjectName"];
var personalAccessToken = ConfigurationManager.AppSettings["PAT"]; // Store securely
if (string.IsNullOrEmpty(collectionUri) || string.IsNullOrEmpty(projectName))
{
Console.WriteLine("Please configure CollectionUri and ProjectName in app.config");
return;
}
Console.WriteLine("=== Legacy SOAP Client Example ===");
Console.WriteLine("WARNING: This uses deprecated SOAP clients.");
Console.WriteLine("Consider migrating to REST clients for better performance and support.");
Console.WriteLine();
VssCredentials credentials;
if (!string.IsNullOrEmpty(personalAccessToken))
{
// Recommended: Use PAT authentication
credentials = new VssBasicCredential(string.Empty, personalAccessToken);
Console.WriteLine("Using Personal Access Token authentication");
}
else
{
// Fallback: Interactive authentication (requires UI)
credentials = new VssClientCredentials();
Console.WriteLine("Using interactive authentication");
}
// Execute the legacy SOAP example
LegacySoapExample.ExecuteWorkItemQuery(collectionUri, projectName, credentials);
Console.WriteLine();
Console.WriteLine("Example completed successfully.");
Console.WriteLine("For new development, see: https://docs.microsoft.com/azure/devops/integrate/concepts/dotnet-client-libraries");
}
catch (Exception ex)
{
Console.WriteLine($"Error: {ex.Message}");
Console.WriteLine();
Console.WriteLine("Migration recommendations:");
Console.WriteLine("1. Update to REST-based client libraries");
Console.WriteLine("2. Use modern authentication (managed identities, service principals)");
Console.WriteLine("3. Migrate to .NET Core/.NET 5+ for better performance");
Environment.Exit(1);
}
Console.WriteLine("Press any key to exit...");
Console.ReadKey();
}
}
Migratie naar moderne clients
Vergelijking naast elkaar
Legacy SOAP-benadering:
// ❌ Legacy SOAP pattern
using (var tpc = new TfsTeamProjectCollection(uri, credentials))
{
var workItemStore = tpc.GetService<WorkItemStore>();
var workItems = workItemStore.Query("SELECT * FROM WorkItems");
// Synchronous, blocking operations
}
Moderne REST-benadering:
// ✅ Modern REST pattern
using var connection = new VssConnection(uri, credentials);
var witClient = connection.GetClient<WorkItemTrackingHttpClient>();
var workItems = await witClient.QueryByWiqlAsync(new Wiql { Query = "SELECT * FROM WorkItems" });
// Asynchronous, non-blocking operations
Belangrijkste verschillen
| Eigenschap | Verouderde SOAP | Moderne REST |
|---|---|---|
| Platformondersteuning | Alleen .NET Framework | .NET Framework, .NET Core, .NET 5+ |
| prestatie | Langzamer, synchroon | Sneller, asynchroon |
| Authenticatie | Beperkte opties | Volledige ondersteuning voor moderne verificatie |
| API-dekking | Alleen verouderde API's | Volledige REST API-dekking |
| Toekomstige ondersteuning | Alleen onderhoud | Actieve ontwikkeling |
| Codepatronen | Synchrone blokkering | Async/await-patronen |
Problemen met verouderde clients oplossen
Veelvoorkomende problemen en oplossingen
Verificatiefouten:
- Zorg ervoor dat PAT's over de juiste toepassingen beschikken.
- Indeling van organisatie-URL controleren (inclusief verzameling voor on-premises)
- Firewall- en proxy-instellingen voor SOAP-eindpunten controleren
Prestatieproblemen:
- SOAP-clients zijn inherent langzamer dan REST
- Overweeg waar mogelijk batchbewerkingen
- Migreren naar REST-clients voor betere prestaties
Platformcompatibiliteit:
- SOAP-clients werken alleen op .NET Framework
- REST-clients gebruiken voor platformoverschrijdende ondersteuning
Hulp krijgen
Voor verouderde SOAP-clientproblemen:
- Bekijk Azure DevOps Developer Community
- Migratierichtlijnen voor moderne alternatieven bekijken
- Overweeg professionele migratieservices voor grote toepassingen
Verwante middelen
Migratiebronnen:
- Voorbeelden van moderne .NET-clientbibliotheek - Aanbevolen vervanging
- Verificatierichtlijnen - Moderne verificatieopties
- Azure DevOps REST API referentie - Volledige API-documentatie
Verouderde documentatie:
Belangrijk
Migratie plannen? Begin met moderne .NET-clientbibliotheekvoorbeelden om de huidige aanbevolen procedures en verificatieopties te bekijken.