2015-05-08 1 views
1

Я создаю приложение WPF, которое использует Google API Client Library for .NET. После образца, я написал код ниже:Как получить результат от Google OAuth API, если пользователь закрывает окно браузера?

 var credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
      Secrets, 
      new[] { "https://www.googleapis.com/auth/contacts.readonly" }, 
      "user", 
      CancellationToken.None, 
      new FileDataStore(TokenStorageName)).Result; 

Призвание AuthorizeAsync метод открывает окно/вкладку новый браузер с формой входа. Проблема возникает, если пользователь просто закроет окно браузера или вкладку. Я никогда не получаю результат этого звонка.

Могу ли я как справиться с этой ситуацией?

Должен ли я изменить исходный код AuthorizeAsync (...)?

ответ

0

Это ошибка в клиентской библиотеке. No time out on GoogleWebAuthorizationBroker.AuthorizeAsync? В настоящее время единственным вариантом является создание тайм-аута самостоятельно.

+0

Спасибо! К сожалению, я не могу предсказать ожидания пользователей и не могу предсказать, какой тайм-аут будет разумным. – Artem

+0

Я играл с 2-минутным ожиданием. Что-то дольше, чем это, и я просто спрошу их снова. Я бы поделился кодом, но в данный момент меня это не устраивает. – DaImTo

+0

Прошу прояснить. Ваш добавочный 2-минутный тайм-аут к исходному коду API Google и теперь хотите подготовить запрос на push? – Artem

2

Единственный способ, которым мне удалось обойти ошибку, - добавить период ожидания, например, предложенный DalmTo. Это не идеально, но я не нашел другого пути вокруг проблемы.

Для этого я использовал следующий код:

  '/ Create a new threading task /' 
      Dim objTask As Task(Of Google.Apis.Auth.OAuth2.UserCredential) 

      '/ Call google auth process /' 
      objTask = GoogleWebAuthorizationBroker.AuthorizeAsync(objSecrets, mobjScopes, "user", CancellationToken.None, objFileStore) 

      '/ Wait 2 minutes for a response /' 
      objTask.Wait(240000) 

      '/ If time out period expired status will still be Waiting for Activation /' 
      If objTask.Status <> Tasks.TaskStatus.WaitingForActivation Then 
       '/ Return user credentials /' 
       Return objTask.Result 
      End If 
Смежные вопросы