Microsoft Graph抛出Request_ResourceNotFound而不是null / 0

时间:2019-08-22 08:46:18

标签: c# asp.net-mvc azure-active-directory microsoft-graph

我是一个有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,只是不向用户显示没有其上级权限的直接管理员。

2 个答案:

答案 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