v12之后,Microsoft Graph SDK停止工作

时间:2019-09-05 18:35:58

标签: c# microsoft-graph microsoft-graph-sdks

我在项目中使用了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函数是否有变化?

2 个答案:

答案 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();