C# 如何以编程方式将审阅者分配给AzureDevOps PullRequest?

C# 如何以编程方式将审阅者分配给AzureDevOps PullRequest?,c#,azure-devops,pull-request,C#,Azure Devops,Pull Request,我知道如何使用gitHttpClient在VSTS中创建pull请求,就像在gitHttpClient.CreatePullRequestAsync(gitPullRequest,repositoryId).Result中一样,但我不确定如何添加审阅者。有什么建议吗 以下是创建拉取请求的示例代码: public static async void CreatePullRequest( GitHttpClient gitHttpClient, Git

我知道如何使用gitHttpClient在VSTS中创建pull请求,就像在
gitHttpClient.CreatePullRequestAsync(gitPullRequest,repositoryId).Result中一样,但我不确定如何添加审阅者。有什么建议吗

以下是创建拉取请求的示例代码:

public static async void CreatePullRequest(
            GitHttpClient gitHttpClient,
            GitPullRequest gitPullRequest,
            string repositoryId
            )
        {
            GitPullRequest pullRequest = gitHttpClient.CreatePullRequestAsync(gitPullRequest, repositoryId, cancellationToken: CancellationToken.None).Result;
        }

注意:要使以下代码正常工作,首先需要在NuGet console
安装包Microsoft.TeamFoundationServer.ExtendedClient中执行以下命令,以安装所需的库

在此解决方案中,首先创建拉取请求,然后添加审阅者。下面的代码显示了创建pull请求然后添加审阅者所需的所有步骤。可以轻松修改代码以添加多个审阅者

    using System;
    using System.Threading;
    using Microsoft.TeamFoundation.SourceControl.WebApi;
    using System.Threading.Tasks;
    using Microsoft.VisualStudio.Services.Identity;
    using Microsoft.VisualStudio.Services.Identity.Client;
    using Microsoft.VisualStudio.Services.Common;

namespace AddingReviewersToVstsPullRequestProgramatically
{
    public class PullRequestReviewerAdder
    {

            /// <summary>
            /// Creates a pull request, and then adds a reviewer to it.
            /// </summary>
            /// <param name="gitHttpClient"> GitHttpClient that is created for accessing vsts</param>
            /// <param name="gitPullRequest"> the pull request to be created</param>
            /// <param name="repositoryId"> the unique identifier of the repository</param>
            /// <param name="reviewerAlias"> reviewer's alias in vsts</param>
            /// <param name="vstsAccountUrl">vsts account's url</param>
            /// <param name="personalToken"> personal access token to access the vsts account. </param>
            public static async void CreatePullRequestAndAddReviewer(
                GitHttpClient gitHttpClient,
                GitPullRequest gitPullRequest,
                string repositoryId,
                string reviewerAlias,
                Uri vstsAccountUrl,
                string personalToken)
            {
                // 1- Create the pull request.
                GitPullRequest pullRequest = gitHttpClient.CreatePullRequestAsync(gitPullRequest, repositoryId, cancellationToken: CancellationToken.None).Result;

                // 2- Create an Identity Client to get the reviewer's vsts id
                IdentityHttpClient identityHttpClient = CreateIdentityClient(vstsAccountUrl, personalToken);

                // 3- Find the reviewer's vsts identity.
                Identity identity = SearchForReviewerVstsIdentity(identityHttpClient, reviewerAlias).Result;

                // 4- Create a IdentityRefWithVote for the reviewer
                IdentityRefWithVote identityRefWithVote = new IdentityRefWithVote
                {
                    Id = identity.Id.ToString(),
                    IsRequired = true // false otherwise.
                };

                // 5- Finally add the reviewer to the pull request.
                await AddReviewerToPullRequest(gitHttpClient, pullRequest, identityRefWithVote);
            }

            /// <summary>
            /// Creates an identity client. This is needed for fetching a reviewer's vsts identity.
            /// </summary>
            /// <param name="vstsAccountUrl">vsts account's url</param>
            /// <param name="personalToken"> personal access token to access the vsts account. </param>
            /// <returns>an IdentityHttpClient to use for retrieving identities from vsts. </returns>
            public static IdentityHttpClient CreateIdentityClient(Uri vstsAccountUrl, string personalToken)
            {
                var vstsCredential = new VssBasicCredential(string.Empty, personalToken);
                IdentityHttpClient identityHttpClient = new IdentityHttpClient(vstsAccountUrl, vstsCredential);
                return identityHttpClient;
            }

            /// <summary>
            /// Given an alias on vsts, searches for its vsts identity.
            /// </summary>
            /// <param name="identityHttpClient"> is the vsts identity client.</param>
            /// <param name="alias">is the alias for which the identity is being searched for.</param>
            public static async Task<Identity> SearchForReviewerVstsIdentity(IdentityHttpClient identityHttpClient, string alias)
            {
                try
                {
                    // Notice : you can also search based on factors other than alias.
                    IdentitiesCollection identitiesPerAlias = await identityHttpClient
                        .ReadIdentitiesAsync(IdentitySearchFilter.Alias, alias).ConfigureAwait(false);
                    if (identitiesPerAlias.Count == 1) // Found one identity-- the ideal case
                    {
                        return identitiesPerAlias[0];
                    }

                    Console.WriteLine($"Encountered a problem finding vsts identity foralias {alias}.");
                }
                catch (Exception ex)
                {
                    Console.WriteLine($"Exception when looking for vsts identity for alias {alias}. {ex}");
                }

                // Notice : watch out for null case...
                return null;
            }

            /// <summary>
            /// Adds a reviewer to a an already created pull request.
            /// </summary>
            /// <param name="gitHttpClient">GitHttpClient that is created for accessing vsts</param>
            /// <param name="pullRequest"> pull request that is already created.</param>
            /// <param name="identity">identity of the reviewer that we want to add to the pull request.</param>
            public static async Task AddReviewerToPullRequest(GitHttpClient gitHttpClient, GitPullRequest pullRequest, IdentityRefWithVote identity)
            {
                identity = await gitHttpClient.CreatePullRequestReviewerAsync(
                    identity,
                    pullRequest.Repository.Id,
                    pullRequest.PullRequestId,
                    identity.Id).ConfigureAwait(false);
            }
   }
使用系统;
使用系统线程;
使用Microsoft.TeamFoundation.SourceControl.WebApi;
使用System.Threading.Tasks;
使用Microsoft.VisualStudio.Services.Identity;
使用Microsoft.VisualStudio.Services.Identity.Client;
使用Microsoft.VisualStudio.Services.Common;
命名空间以编程方式添加ReviewersToVstsPullRequest
{
公共类加法器
{
/// 
///创建拉取请求,然后向其添加审阅者。
/// 
///为访问VST而创建的GitHttpClient
///要创建的拉取请求
///存储库的唯一标识符
///vsts中的审阅者别名
///vsts帐户的url
///访问vsts帐户的个人访问令牌。
公共静态异步void CreatePullRequestAndAddresseViewer(
GitHttpClient GitHttpClient,
GitPullRequest GitPullRequest,
字符串repositoryId,
字符串别名,
Uri vstsAccountUrl,
字符串(个人令牌)
{
//1-创建拉取请求。
GitPullRequest pullRequest=gitHttpClient.CreatePullRequestAsync(GitPullRequest,repositoryId,cancellationToken:cancellationToken.None);
//2-创建标识客户端以获取审阅者的vsts id
IdentityHttpClient IdentityHttpClient=CreateIdentityClient(vstsAccountUrl,personalToken);
//3-查找审阅者的vsts身份。
Identity Identity=SearchForReviewerVstsIdentity(identityHttpClient,reviewerAlias)。结果;
//4-为审阅者创建IdentityRefWithVote
IdentityRefWithVote IdentityRefWithVote=新IdentityRefWithVote
{
Id=identity.Id.ToString(),
IsRequired=true//否则为false。
};
//5-最后将审阅者添加到pull请求中。
等待AddReviewerToPullRequest(gitHttpClient、pullRequest、identityRefWithVote);
}
/// 
///创建标识客户端。这是获取审阅者的vsts标识所必需的。
/// 
///vsts帐户的url
///访问vsts帐户的个人访问令牌。
///用于从VST检索标识的IdentityHttpClient。
公共静态标识HttpClient CreateIdentityClient(Uri vstsAccountUrl,字符串personalToken)
{
var vstsCredential=新的VssBasicCredential(string.Empty,personalToken);
IdentityHttpClient IdentityHttpClient=新IdentityHttpClient(vstsAccountUrl,vstsCredential);
返回标识HttpClient;
}
/// 
///给定vsts上的别名,搜索其vsts标识。
/// 
///是vsts标识客户端。
///为其搜索标识的别名。
公共静态异步任务SearchForReviewerVstsIdentity(IdentityHttpClient IdentityHttpClient,字符串别名)
{
尝试
{
//注意:您也可以基于alias以外的因素进行搜索。
identiescollection identiesperalias=等待identityHttpClient
.ReadIdentitesAsync(IdentitySearchFilter.Alias,Alias).ConfigureAwait(false);
if(identiesperalias.Count==1)//找到一个标识——理想情况
{
返回标识[0];
}
WriteLine($“在查找LIAS{alias}的vsts标识时遇到问题。”);
}
捕获(例外情况除外)
{
WriteLine($“查找别名{alias}.{ex}的vsts标识时发生异常”);
}
//注意:注意空的情况。。。
返回null;
}
/// 
///向已创建的请求添加审阅者。
/// 
///为访问VST而创建的GitHttpClient
///已创建的拉取请求。
///要添加到请求中的审阅者的身份。
公共静态异步任务AddReviewerToPullRequest(GitHttpClient GitHttpClient,GitPullRequest pullRequest,IdentityRefWithVote identity)
{
标识=等待gitHttpClient.CreatePullRequestReviewerAsync(
身份,
pullRequest.Repository.Id,
pullRequest.PullRequestId,
identity.Id).配置等待(false);
}
}

感谢您发布这个自我回答的问题!但是这个概念经常被一些堆栈溢出用户误解。这段代码非常有用。我仍然试图理解reviewerAlias的样子。您能给我举个例子吗?