C# Microsoft Graph抛出请求\u ResourceNotFound而不是null/0
我是一名学徒,有4个月的工作经验,我有一项任务,就是使用Microsoft Graph中的数据构建一个假期请求应用程序。应用程序的功能之一是查找用户的ss管理器并将其显示在仪表板上。在我老板登录之前,一切都很顺利。运行Microsoft Graph Query查找当前用户管理器后,Graph Api返回错误C# Microsoft Graph抛出请求\u ResourceNotFound而不是null/0,c#,asp.net-mvc,azure-active-directory,microsoft-graph-api,C#,Asp.net Mvc,Azure Active Directory,Microsoft Graph Api,我是一名学徒,有4个月的工作经验,我有一项任务,就是使用Microsoft Graph中的数据构建一个假期请求应用程序。应用程序的功能之一是查找用户的ss管理器并将其显示在仪表板上。在我老板登录之前,一切都很顺利。运行Microsoft Graph Query查找当前用户管理器后,Graph Api返回错误(请求\u ResourceNotFound),并中断整个应用程序,而不是返回null或0。我不知道如何处理那个错误 如果结果是null,我尝试返回null,但没有任何效果 这是我的控制器所期
(请求\u ResourceNotFound)
,并中断整个应用程序,而不是返回null或0。我不知道如何处理那个错误
如果结果是null
,我尝试返回null
,但没有任何效果
这是我的控制器所期望的:
var allUsersConnectedToCurrentManagerDisplayName = graphHelper.GetManagerForCurrentUser(userIdToCheck).DisplayName;
var allUsersConnectedToCurrentManagerEmail = graphHelper.GetManagerForCurrentUser(userIdToCheck).UserPrincipalName;
var allUsersConnectedToCurrentManagerId = graphHelper.GetManagerForCurrentUser(userIdToCheck).Id;
Microsoft图形助手:
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,只是在没有任何人在上面的情况下不为用户显示直接管理者 必须捕获异常才能返回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;
}
}
您还可以将函数设置为异步,如下所示:
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;
}
}
公共异步任务GetDirectManagerForUser(GraphServiceClient\u GraphServiceClient,字符串managerId)
{
尝试
{
var manager=await_graphServiceClient.Users[managerId].manager.Request().GetAsync();
退货经理;
}
捕获(例外)
{
返回null;
}
}
为什么不指定一个?所以这里有一些事情要做 第一个也是最明显的问题是,您的代码连续三次从图中请求相同的用户记录。您对
GetDirectManagerForUser
的每次呼叫都会下载整个用户配置文件。您希望避免这样做:
var-manager=await-graphhelp.GetManagerForCurrentUser(userIdToCheck);
var allUsersConnectedToCurrentManagerDisplayName=manager.DisplayName;
var allustersconnectedtocurrentmanagermail=manager.UserPrincipalName;
var allUsersConnectedToCurrentManagerId=manager.Id;
要避免的第二个问题是将请求包装到这样的任务中。它给代码增加了很多复杂性,使调试变得非常困难,而且不是必需的。只需在方法级别添加async Task
,并让编译器为您处理关联:
异步任务GetDirectManagerForUser(GraphServiceClient\u GraphServiceClient,字符串managerId)
第三,您可以投射结果,但不捕获任何异常(即404
您的获取)。您希望捕获这些内容并返回一个空用户:
var-manager=await-graphhelp.GetManagerForCurrentUser(userIdToCheck);
var allUsersConnectedToCurrentManagerDisplayName=manager.DisplayName;
var allustersconnectedtocurrentmanagermail=manager.UserPrincipalName;
var allUsersConnectedToCurrentManagerId=manager.Id;
异步任务GetDirectManagerForUser(GraphServiceClient\u GraphServiceClient,字符串managerId)
{
尝试
{
//正常路径
返回等待图服务客户端
.Users[managerId]
经理
.Request()
.GetAsync();
}
捕获(例外)
{
//出了点问题或者没有经理
var emptyUser=新用户();
}
}