出于某种原因,以下代码给出了未经授权的例外,任何人都可以告诉我我做错了什么吗?
在下面的屏幕截图中,您可以找到" theToken"的内容,这些内容已通过Office365接收并保存在数据库中(在执行前1分钟)
Async Function CalendarDemo() As System.Threading.Tasks.Task(Of ActionResult)
Dim tokenData = UserTokenService.GetToken(HttpContext.User.Identity.Name)
Dim theToken = tokenData.ReadItems(0)
Dim myCalendars As List(Of ViewModels.Office365.MyCalendar) = New List(Of ViewModels.Office365.MyCalendar)
Try
Dim accessToken As Func(Of String) = Function() As String
Return theToken.AccessToken
End Function
Dim discClient As New DiscoveryClient(New Uri("https://api.office.com/discovery/v1.0/me/"), accessToken)
Dim dcr = Await discClient.DiscoverCapabilityAsync("Calendar") 'This is where the code breaks, the code worked in the past. Till i split up the authorization and the fetching of the Calendar
ViewBag.ResourceId = dcr.ServiceResourceId
Dim exClient As New OutlookServicesClient(dcr.ServiceEndpointUri, Function()
Return Helpers.Office365Helpers.ReturnStringAsAsync(theToken.AccessToken)
End Function)
Dim calendarResults = Await exClient.[Me].Events.ExecuteAsync()
Dim calenderResults = Await exClient.Me.Calendar.Events.ExecuteAsync()
Do
Dim calendars = calendarResults.CurrentPage
For Each calendar In calendars
Dim newCalendar = New ViewModels.Office365.MyCalendar(calendar)
myCalendars.Add(newCalendar)
Next
calendarResults = Await calendarResults.GetNextPageAsync()
Loop While calendarResults IsNot Nothing
Catch exception As AdalException
' handle token acquisition failure
If exception.ErrorCode = AdalError.FailedToAcquireTokenSilently Then
'authContext.TokenCache.Clear()
'Redirect naar login of refresh token
ViewBag.ErrorMessage = "AuthorizationRequired"
End If
Catch exception As DiscoveryFailedException
End Try
Return View(myCalendars)
End Function
例外是:"类型'的例外情况Microsoft.Office365.Discovery.DiscoveryFailedException'被扔了。" - 而且ErrorCode是“未经授权的”
根据以下答案,我更改了以下代码:
Dim exClient As New OutlookServicesClient(New Uri("https://outlook.office365.com/api/v1.0/"), Function()
Return Helpers.Office365Helpers.ReturnStringAsAsync(theToken.AccessToken)
End Function)
Dim calendarResults = Await exClient.[Me].Events.Take(10).ExecuteAsync()
我的助手是:
Public Module Office365Helpers
Public Async Function ReturnStringAsAsync(ToReturnString As String) As System.Threading.Tasks.Task(Of String)
Return Await System.Threading.Tasks.Task.Delay(1).ContinueWith(Function(dl) ToReturnString)
End Function
End Module
但是当它加载时它没有返回任何值。就像api调用是连续循环一样。
同样的问题,但更短:
我有一个Microsoft.IdentityModel.Clients.ActiveDirectory.TokenCache,如何使用DLL&vs.net查询Microsoft Calendar API以获取数据。
答案 0 :(得分:1)
在ODataException中,在响应中,您可以查看标题值。
那里有一个错误解释了我的错误,它说的是:"不一致的资源"。这可能是真的。我发现在请求令牌时我没有使用https://outlook.office365.com/api/v1.0/。但在请求数据时使用它。
所以我收到了无效的令牌,因为我试图做的事情。
答案 1 :(得分:0)
您的资源应为https://api.office.com/discovery/
,以便调用Discovery服务。但是,由于您正在调用Calendar API,因此您可以跳过发现。端点固定为https://outlook.office365.com/api/v1.0/
。
如果您遇到问题,请尝试.NET tutorial上的https://dev.outlook.com。