0

Я пытаюсь извлечь HttpStatusCode из каждого вызова метода DownloadAsync. Мне нужен код состояния, чтобы правильно выполнить экспоненциальный алгоритм отсрочки, чтобы повторить неудачную загрузку, отобразить сообщение об ошибке пользователю, когда не повторите загрузку и сообщите об успешности загрузки. Меня не волнует, как он получен, если он чист и не анализируется из свойства Exception.Message (string), такого как Tor Jonsson, предложенного в приведенной ниже ссылке.Google.Apis.Email_Migration_v2

Чтобы заставить «Ошибка запроса на ошибку [400]» Я просто предоставил недопустимый ключ пользователя (адрес электронной почты) в конструкторе для MailResource.InsertMediaUpload.
, например. MailResource.InsertMediaUpload (MailItem, "[email protected]", поток, "сообщение/rfc822")

Проблема

1) GoogleApiException.HttpStatusCode всегда равен 0 (нет). Даже когда Exception.Message, как представляется, содержит код состояния в скобках. например [400]
2) Не удается найти исключение GoogleApiRequestException.

Вопросы
1) Что является лучшим способом для выполнения экспоненциального алгоритма обратно-офф ???
2) Является ли это ожидаемым поведением для этого свойства в этом случае?
3) Остается ли исключение GoogleApiRequestException, если да где?

Side Примечание:
Я также заметил, что класс GoogleApiRequestException больше не находится в том же файле класса GoogleApiException. Переместить его в другое пространство имен или удалить? Потому что я хотел бы попытаться поймать объект GoogleApiRequestException и захватить его объект RequestError.

Я добавил ссылки на два различия для того, что я имею в виду:

До: http://code.google.com/p/google-api-dotnet-client/source/browse/Src/GoogleApis/GoogleApiException.cs?r=a8e27790f8769c1d6aaae030bb46c79daa7cdbad

После: http://code.google.com/p/google-api-dotnet-client/source/browse/Src/GoogleApis/GoogleApiException.cs?r=d6f06e92d90b635c179013e2c287b42b82909c09

Источники

Я использую последние двоичные файлы из NuGet (1,6 .0.8-beta)

Единственный вопрос, который я нашел связанный с моей проблемой: (Может только отправлять две ссылки ... Heres сырье) stackoverflow.com/questions/18985306/httpstatuscode-not-set-in-exceptions-when-using-google-net-apis

Код: (Использование пользовательского регистратор для записи DebugView)

public int Index; // Used to Id the process 
    private void TryUpload(MailResource.InsertMediaUpload upload, out IUploadProgress uploadProgress, out bool retryUpload) 
    { 
     uploadProgress = null; 
     retryUpload = false; 
     CancellationToken token; 

     try 
     { 
      uploadProgress = upload.UploadAsync(token).Result; 

      if (uploadProgress.Exception != null) 
      { 
       _logger.WriteTrace("EXCEPTION!!! Type: {0}", uploadProgress.Exception.GetType().ToString()); // Remove: 

       // *) Handle all of the various exceptions 
       if (uploadProgress.Exception is JsonReaderException) 
       { 
        JsonReaderException jreEx = uploadProgress.Exception as JsonReaderException; 
        _logger.WriteTrace("JsonReaderException-> Message: {0}", jreEx.Message); 
       } 

       if (uploadProgress.Exception is TokenResponseException) 
       { 
        TokenErrorResponse trEx = uploadProgress as TokenErrorResponse; 
        _logger.WriteTrace("TokenErrorResponse-> Message: {0}", trEx.Error); 
       } 

       if (uploadProgress.Exception is HttpRequestValidationException) 
       { 
        HttpRequestValidationException hrvEx = uploadProgress.Exception as HttpRequestValidationException; 
        _logger.WriteTrace("HttpRequestValidationException-> Message: {0}", hrvEx.Message); 
        _logger.WriteTrace("HttpRequestValidationException-> Status Code: {0}", hrvEx.GetHttpCode()); 
       } 

       if (uploadProgress.Exception is GoogleApiException) 
       { 
        GoogleApiException gApiEx = uploadProgress.Exception as GoogleApiException; 
        _logger.WriteTrace("GoogleApiException-> Message: {0}", gApiEx.Message); 
        _logger.WriteTrace("GoogleApiException-> Status Code: {0}", gApiEx.HttpStatusCode); 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
      _logger.WriteTrace(ex, "An exception occured while uploading..."); 
     } 
     finally 
     { 
      if (uploadProgress != null) 
       _logger.WriteTrace("Upload Completed... Status: {0} Exception?: {1}", 
        uploadProgress.Status, 
        (uploadProgress.Exception == null) ? "None" : uploadProgress.Exception.ToString()); 
      else 
       _logger.WriteTrace("Upload Aborted... Exited without returning a status!"); 
     } 
    } 

Выход Отрывок
[5224] (T101) VSLLC: ИСКЛЮЧЕНИЕ !!! Тип: Google.GoogleApiException
[5224] (T101) VSLLC: GoogleApiException-> Сообщение: Google.Apis.Requests.RequestError
[5224] Bad Request [400]
[5224] Ошибки [
[5224] Сообщение [Bad Request] Местоположение [-] Причина [badRequest] Домен [глобальный]
[5224]]
[5224 ] (T101) VSLLC: GoogleApiException->Код состояния: 0
[5224] (T101) VSLLC: Upload Completed ... Статус: Failed Exception ?: Администратор службы сделал исключение: Google.GoogleApiException: Google. Apis.Requests.RequestError
[5224] Плохой запрос [400]
[5224] Ошибки [
[5224] Сообщение [Bad Request] Местоположение [-] Причина [badRequest] Домен [глобальный]
[5224]]
[5224]
[5224] в Microsoft.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (задача задач)
[5224] на Microsoft.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccess (задача) Задача
[5224] на Microsoft.Runtime.CompilerServices.TaskAwaiter.ValidateEnd (задача) Задача
[5224] на Google.Apis.Upload .ResumableUpload`1.d__0.MoveNext() в c: \ code \ google.com \ google-api-dotnet-client \ default \ Tools \ Google.Apis.Release \ bin \ Debug \ output \ default \ Src \ GoogleApis \ Apis [Media] \ Upload \ ResumableUpload.cs: строка 373


Извините за обстоятельный пост! Спасибо за ваше время!

ответ

1
  1. Библиотека уже поддерживает экспоненциальный откат для 503 ответов. В случае 400 (плохой запрос) вы не должны повторять попытку, потому что вы получите тот же ответ снова и снова. Взгляните на параметр инициализатора услуги DefaultExponentialBackOffPolicy Вы также можете заглянуть в наш ExponentialBackOff implementation. BackOffHandler обертывает логику и реализует неудачный обработчик ответа и обработчик исключений.
  2. GoogleApiRequest больше не существует.
  3. Похоже, что мы не устанавливаем код состояния должным образом, как вы можете найти here. Я открываю новую проблему в нашем трекер-проблеме, доступную здесь - https://code.google.com/p/google-api-dotnet-client/issues/detail?id=425. Не стесняйтесь добавлять к нему больше контента.
+0

Спасибо за понимание, которое ответила на все, что мне нужно было знать в данный момент. Если есть что-то еще, я опубликую новый вопрос или напишу комментарий. Еще новичок в SO, не уверен, что такое протокол. – 580