需要有关在Microsoft.Graph中使用多个任务获取访问令牌的建议

时间:2018-03-05 10:22:49

标签: azure-active-directory microsoft-graph

我使用Microsoft.Graph仅针对Azure AD进行应用调用。 简而言之,我的代码如下(C#.NET 4.5):

Task userQueryTask = Task.Run(async () =>
{
    IGraphServiceUsersCollectionPage users = await connection.GraphService.Users.Request().Select(userSelect).Filter(userFilter).GetAsync();
}, cts.Token);

Task groupQueryTask = Task.Run(async () =>
{
    IGraphServiceGroupsCollectionPage groups = await connection.GraphService.Groups.Request().Select(groupSelect).Filter(groupFilter).GetAsync();
}, cts.Token);

Task.WaitAll(new Task[2] { userQueryTask, groupQueryTask }, Constants.timeout, cts.Token);

以下是我的问题:

谢谢

1 个答案:

答案 0 :(得分:0)

  

在并行运行的2个任务中使用相同的GraphServiceClient对象是一个好习惯吗?

Robert Anderson回答Recommended lifetime for a GraphServiceClient instance

  

Graph客户端对象是线程安全且可重入的。它是一个容器,包含用于通过构建器模式构造请求对象的配置,提供程序和帮助程序。

由于GraphServiceClient是线程安全的,因此您可以跨多个线程重用相同的实例。 AFAIK,如果您创建了许多HttpClient实例来访问相关的Graph API,您可能还需要重用一组实例,否则您可能会遇到内存泄漏问题。

  

我应该尝试改进这一点并避免两个任务都获得访问令牌吗?

根据我的经验,您最好使用相同的access_token,而不是为每项任务生成令牌。此外,您可以创建一个TokenHelper类来缓存获取的access_token并记录过期时间。在GetTokenAsync方法下,您需要验证当前的access_token(如果为null,则获取新令牌;如果令牌即将过期,则再次获取新令牌)。

var graphClient = new GraphServiceClient(
            "https://graph.microsoft.com/v1.0",
            new DelegateAuthenticationProvider(
                async (requestMessage) =>
                {
                    var token = await TokenHelper.GetTokenAsync();
                    requestMessage.Headers.Authorization = new AuthenticationHeaderValue("bearer", token);
                }));

注意: TokenHelper.GetTokenAsync方法可能需要是线程安全的。