使用VSTS/TFS Rest .Net库时,如何获取标识的唯一显示名称?
获取标识唯一显示名称并更新工作项AssignedTo字段的解决方案
刚好我之前在处理Azure DevOps(原VSTS/TFS)工作项更新的时候,也碰到过这个关于唯一显示名称的问题,给你分享几个实用的解决方案,适配Rest .NET库的场景:
方法一:通过Azure DevOps Rest API直接查询标识
你可以调用_apis/identities端点来获取目标标识的完整信息,其中就包含我们需要的唯一显示名称。支持通过标识ID、别名或者邮箱来查询:
using System.Net.Http; using System.Net.Http.Headers; using System.Text.Json; var httpClient = new HttpClient(); httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); // 替换成你的PAT令牌 httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "your_personal_access_token"); // 示例:按标识ID查询 var apiUrl = "https://dev.azure.com/{your_organization}/_apis/identities?ids={target_identity_id}&api-version=7.1-preview.1"; var response = await httpClient.GetAsync(apiUrl); response.EnsureSuccessStatusCode(); var jsonContent = await response.Content.ReadAsStringAsync(); var identityResponse = JsonSerializer.Deserialize<IdentityResponse>(jsonContent); var uniqueDisplayName = identityResponse.Value.FirstOrDefault()?.UniqueDisplayName; // 对应的模型类,用于反序列化返回结果 public class IdentityResponse { public List<Identity> Value { get; set; } } public class Identity { public string UniqueDisplayName { get; set; } // 可以根据需要添加其他属性,比如Id、DisplayName等 }
方法二:使用官方Azure DevOps .NET Client Library
如果你用的是官方的Microsoft.TeamFoundationServer.Client NuGet包,可以通过IdentityHttpClient来更便捷地获取标识信息,不需要自己处理HTTP请求和序列化:
using Microsoft.VisualStudio.Services.Common; using Microsoft.VisualStudio.Services.WebApi; using Microsoft.TeamFoundation.Identity.WebApi; // 建立与Azure DevOps的连接 var orgUrl = new Uri("https://dev.azure.com/{your_organization}"); var credentials = new VssBasicCredential(string.Empty, "your_personal_access_token"); var connection = new VssConnection(orgUrl, credentials); // 获取IdentityHttpClient实例 var identityClient = connection.GetClient<IdentityHttpClient>(); // 方式1:通过标识ID查询 var targetIdentityId = Guid.Parse("{target_identity_id}"); var identities = await identityClient.ReadIdentitiesAsync(ids: new[] { targetIdentityId }, queryMembership: IdentityQueryMembership.None); var uniqueDisplayName = identities.FirstOrDefault()?.UniqueDisplayName; // 方式2:通过别名/邮箱搜索 var searchResults = await identityClient.SearchIdentitiesAsync(searchTerm: "user_alias_or_email", organizationName: "{your_organization}"); var uniqueDisplayNameFromSearch = searchResults.FirstOrDefault()?.UniqueDisplayName;
用唯一显示名称更新工作项的AssignedTo字段
拿到唯一显示名称之后,就可以正常更新System.AssignedTo字段了,确保符合新的标识字段规则:
using Microsoft.TeamFoundation.WorkItemTracking.WebApi; using Microsoft.TeamFoundation.WorkItemTracking.WebApi.Models; // 获取WorkItemTrackingHttpClient实例 var workItemClient = connection.GetClient<WorkItemTrackingHttpClient>(); // 创建更新补丁 var patchDocument = new JsonPatchDocument(); patchDocument.Add(new JsonPatchOperation { Operation = Operation.Add, Path = "/fields/System.AssignedTo", Value = uniqueDisplayName // 这里传入获取到的唯一显示名称 }); // 执行工作项更新 await workItemClient.UpdateWorkItemAsync(patchDocument, projectNameOrId: "{your_project_id}", id: target_work_item_id);
补充说明:旧客户端OM里的IdentityManagementService.GetUniqueDisplayName方法,本质上也是调用了类似的底层接口,上面的两种方案就是Rest生态下的替代实现,完全适配新的唯一显示名称规则。
内容的提问来源于stack exchange,提问作者anon
相关产品推荐
相关产品推荐

