c# - Microsoft Graph API 调用无限期挂起

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

我正在尝试使用 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 的异步/等待模式。

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;
}

最佳答案

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

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

作为玩弄它的结果。对我有用的是 用 await 替换 .GetAwaiter().GetResult()。(我不确定为什么会修复它,但确实如此)

来自:

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

收件人:

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

希望这对以后的人有帮助

关于c# - Microsoft Graph API 调用无限期挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55944518/

相关文章:

c# - 如何从 C# 中的数组中获取不同的值?

c# - MVC 构建 - 根据构建配置编辑连接字符串文件 (VS2012)

c# - Web API OData EnableLowerCamelCase

javascript - WEB API - 如何使用身份向用户中的自定义属性添加值

java - Microsoft Graph - Java;授权代码提供者 : how to get the "authorizationCode"

office365 - 如何通过自定义守护程序和图形 REST API 访问多个用户的 OneDrive 文件?

c# - 错误 :-(Exception from HRESULT: 0x8001010A (RPC_E_SERVERCALL_RETRYLATER))

c# - 扫描自定义属性的所有类和方法的最佳实践

c# - 如何从 WebAPI 响应 json 中删除 EF 的导航属性空数组?

azure - 如何为在Azure注册的应用程序启用 "Sites.Manage.All"委派权限?