You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:32:50