我在项目中使用了Microsoft Graph SDK v12,一切正常,但是将NuGet软件包更新为v17后,它停止工作。我没有收到对请求的任何回应,它一直在等待。
我正在使用https://login.microsoftonline.com/common/oauth2/v2.0/authorize
进行授权,然后使用https://login.microsoftonline.com/common/oauth2/v2.0/token
获得令牌。
我正在使用以下代码创建GraphServiceClient
return new GraphServiceClient(new DelegateAuthenticationProvider((requestMessage) =>
{
requestMessage
.Headers
.Authorization = new AuthenticationHeaderValue("bearer", DataHelper.AccessToken);
return Task.FromResult(0);
}));
之后,我尝试使用以下方式访问日历:
var op = graphClient
.Me
.CalendarGroups
.Request()
.GetAsync()
.Result.Select(x => x)
.ToList();
在v12中,相同的功能可以正常工作,但在v12以上的任何版本中,它均无法正常工作。
新版本中的身份验证或调用API函数是否有变化?
答案 0 :(得分:1)
由于在应用程序中调用.Result
而导致僵局,我猜想您正在DataHelper.AccessToken中调用.Result
。在使用单线程SyncronizationContext的应用程序(如WinForms或ASP.NET)中运行时,此操作将失败。
由于调用这些方法的顺序,它以前可以工作。现在,在请求管道中调用DelegatedAuthProvider,以启用增量同意并利用MSAL令牌缓存。现在,这将导致从异步方法中调用异步方法。由于同步方法的类型,这将在控制台应用程序中起作用,但在ASP.NET或WinForms中将不起作用。
您需要将DataHelper.AccessToken设为async
方法,而await
可以解决此问题。或者,您可以使用我们新的AuthenticationProviders之一来解决此问题。
答案 1 :(得分:0)
GetAsync
方法返回一个Task,因此您应该等待调用。
// \...../
var op = await graphClient
.Me
.CalendarGroups
.Request()
.GetAsync()
.ToList();