【问题标题】:Microsoft Graph API call hangs indefinitelyMicrosoft Graph API 调用无限期挂起
【发布时间】:2019-05-02 01:15:38
【问题描述】:

我正在尝试使用 Microsoft Graph 查询 Azure Active Directory 用户信息。我可以很好地进行身份验证,但是当我尝试查询用户信息client.Users 时,我的应用程序无限期挂起:没有超时,没有错误,只是挂起。我找到了this post,但是那里的建议对我没有帮助。

public bool GetUserByUniqueID(string uid, out GraphUser user)
{
    bool ret = false;
    user = new GraphUser();
    if (Authenticate(out AuthToken token))
    {
        GraphServiceClient client = GetGraphServiceClient(token);
        // The below code hangs indefinitely
        User user = client.Users[uid].Request().Select(GraphProperties).GetAsync().GetAwaiter().GetResult();
        if (user != null)
        {
            MapGraphUser(ret, user);            
            ret = true;
        }
    }
    return ret;
}

private bool Authenticate(out AuthToken token)
{
    bool ret = false;
    token = new AuthToken();
    string url = $"https://login.microsoftonline.com/{_tenant}/oauth2/v2.0/token";
    RestClient client = new RestClient(url);
    RestRequest request = new RestRequest(Method.POST);
    request.Parameters.Add(new Parameter("grant_type", _grantType, ParameterType.GetOrPost));
    request.Parameters.Add(new Parameter("scope", _scope, ParameterType.GetOrPost));
    request.Parameters.Add(new Parameter("client_secret", _clientSecret, ParameterType.GetOrPost));
    request.Parameters.Add(new Parameter("client_id", _clientId, ParameterType.GetOrPost));
    IRestResponse response = client.Execute<AuthToken>(request);
    if (response.StatusCode == HttpStatusCode.OK)
    {
        token = JsonConvert.DeserializeObject<AuthToken>(response.Content);
        ret = true;
    }
    return ret;
}

2019 年 5 月 2 日更新

将 Microsoft.Graph 和 Microsoft.Graph.Core 恢复到 1.12 版允许我在同步上下文中调用 .GetAwaiter().GetResult()

2020 年 11 月 18 日更新

我已经重构了我的代码,以便在最新版本的 Microsoft.Graph 和 Microsoft.Graph.Core 中使用 async/await 模式。

public async Task<GraphUser> GetUserByUniqueID(string uid)
{
    GraphUser ret = new GraphUser();    
    if (Authenticate(out AuthToken token))
    {
        GraphServiceClient client = GetGraphServiceClient(token);
        User user = await client.Users[uid].Request().Select(GraphProperties).GetAsync();
        if (user != null)
        {
            MapGraphUser(ret, user);            
            ret.Found = true;
        }
    }   
    return ret;
}

【问题讨论】:

  • 我猜你会因为同步使用异步等待模式而陷入僵局。尝试等待您对 GetAsync() 的调用,而不是同步调用 .GetAwaiter().GetResult()。

标签: c# asp.net-web-api2 microsoft-graph-api


【解决方案1】:

我遇到了同样的问题。我在另一篇文章的某处发现它与两个等待同时完成的任务有关。我现在找不到那篇文章了。

对我来说 .GetAwaiter().GetResult();正在计划的工作中工作,但不是作为手动按钮按下任务。

因为玩弄它。对我有用的是将 .GetAwaiter().GetResult() 替换为 await。(我不知道为什么会这样修复它,但确实如此)

发件人:

var results = graphServiceClient.Users[uid].Request().GetAsync().GetAwaiter().GetResult();

收件人:

var results = await graphServiceClient.Users[uid].Request().GetAsync();

希望这对将来的某人有所帮助

【讨论】:

  • 可笑的是,这个实现的质量有多糟糕——微软为什么不解决这个问题?
【解决方案2】:

我在使用 Graph API 的 NPM 包时遇到了同样的问题。恢复到普通的旧请求承诺。现在它没有卡住,但并不总是找到一个组的成员。使用 API 的测试版可以正常工作

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-29
    • 2011-05-07
    • 2021-04-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多