Microsoft Graph API调用无限期挂起

时间:2019-05-02 01:15:39

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

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

这是我的代码:

public bool GetUserByUniqueID(string uid, out GraphUser user)
{
    bool ret = false;
    user = new GraphUser();
    if (Authenticate(out AuthToken token))
    {
        GraphServiceClient graphServiceClient = GetGraphServiceClient(token);
        // The below code hangs indefinitely
        User graphUser = graphServiceClient.Users[uid].Request()
            .Select("id,displayName,userPrincipalName,userType,accountEnabled").GetAsync().GetAwaiter()
            .GetResult();
        if (graphUser != null)
        {
            user.ID = graphUser.Id;
            user.DisplayName = graphUser.DisplayName;
            user.PrincipalName = graphUser.UserPrincipalName;
            user.UserType = graphUser.UserType;
            user.AccountEnabled = graphUser.AccountEnabled ?? false;
            user.MemberOf = GetMemberOf(token, graphUser.Id);
            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;
}

3 个答案:

答案 0 :(得分:2)

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

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

由于使用它而产生的结果。对我有用的是将.GetAwaiter()。GetResult()替换为等待状态。(我不确定为什么要修复它,但确实可以做到)

发件人:

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

收件人:

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

希望这对以后的人有帮助

答案 1 :(得分:0)

我已通过恢复到Microsoft.GraphMicrosoft.Graph.Core的先前版本来解决此问题。我使用的是1.14.0版本,现在使用的是1.12.0。 .GetAwaiter().GetResult()在当前版本(1.15.0)的1.14.0中被破坏。

答案 2 :(得分:0)

我在Graph API的NPM软件包中遇到了同样的问题。恢复为简单的旧请求诺言。现在,它没有卡住,但并不总是找到组的成员。使用API​​的Beta版可以正常工作