我是一个有4个月经验的学徒,我承担了使用Microsoft Graph的数据构建假期申请应用程序的任务。该应用程序的功能之一是查找用户的经理并将其显示在仪表板上。一切都进行得很顺利,直到老板登录为止。运行Microsoft Graph Query后,要找到当前的用户管理器,Graph Api会返回错误(Request_ResourceNotFound)
并破坏整个应用程序,而不是返回null或0。我不知道该怎么做。处理该错误。
如果结果为null
,我曾尝试返回null
,但这无济于事。
这是我的控制器所期望的:
var allUsersConnectedToCurrentManagerDisplayName = graphHelper.GetManagerForCurrentUser(userIdToCheck).DisplayName;
var allUsersConnectedToCurrentManagerEmail = graphHelper.GetManagerForCurrentUser(userIdToCheck).UserPrincipalName;
var allUsersConnectedToCurrentManagerId = graphHelper.GetManagerForCurrentUser(userIdToCheck).Id;
Microsoft Graph助手:
User GetDirectManagerForUser(GraphServiceClient _graphServiceClient, string managerId)
{
using(var task = Task.Run(async() => await _graphServiceClient.Users[managerId].Manager.Request().GetAsync()))
{
while (!task.IsCompleted)
Thread.Sleep(200);
var manager = task.Result as Microsoft.Graph.User;
return manager;
}
}
我期望它返回null,只是不向用户显示没有其上级权限的直接管理员。
答案 0 :(得分:1)
因此,您正在执行一些操作。
第一个也是最明显的问题是您的代码连续三遍从Graph请求相同的User记录。您对GetDirectManagerForUser
进行的每次呼叫都将下载整个用户个人资料。您要避免这样做:
var manager = await graphHelper.GetManagerForCurrentUser(userIdToCheck);
var allUsersConnectedToCurrentManagerDisplayName = manager.DisplayName;
var allUsersConnectedToCurrentManagerEmail = manager.UserPrincipalName;
var allUsersConnectedToCurrentManagerId = manager.Id;
要避免的第二个问题是将您的请求包装在这样的Task中。它增加了代码的复杂性,使其调试起来非常困难,并且不是必需的。只需在方法级别添加async Task<>
,然后让编译器为您进行接线:
async Task<User> GetDirectManagerForUser(GraphServiceClient _graphServiceClient, string managerId)
第三,您强制转换结果,但未捕获任何异常(即404
的异常)。您想捕获这些并返回一个空用户:
var manager = await graphHelper.GetManagerForCurrentUser(userIdToCheck);
var allUsersConnectedToCurrentManagerDisplayName = manager.DisplayName;
var allUsersConnectedToCurrentManagerEmail = manager.UserPrincipalName;
var allUsersConnectedToCurrentManagerId = manager.Id;
async Task<User> GetDirectManagerForUser(GraphServiceClient _graphServiceClient, string managerId)
{
try
{
// Normal path
return await _graphServiceClient
.Users[managerId]
.Manager
.Request()
.GetAsync();
}
catch (Exception)
{
// Something went wrong or no manager exists
var emptyUser = new User();
}
}
答案 1 :(得分:0)
您必须捕获异常才能返回null。 我会这样写函数:
public User GetDirectManagerForUser(GraphServiceClient _graphServiceClient, string managerId)
{
//.Result, because this function in synchronious
try
{
var manager = await _graphServiceClient.Users[managerId].Manager.Request().GetAsync().Result;
return manager;
}
catch(Exception)
{
return null;
}
}
您还可以使函数异步:
public async Task<User> GetDirectManagerForUser(GraphServiceClient _graphServiceClient, string managerId)
{
try
{
var manager = await _graphServiceClient.Users[managerId].Manager.Request().GetAsync();
return manager;
}
catch(Exception)
{
return null;
}
}
为什么没有指定accessibility level?