【发布时间】: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