Google.Apis.Email_Migration_v2

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

Чтобы вызвать "Bad Request Error [400]", я просто предоставил недопустимый ключ пользователя (email) в конструкторе для MailResource.InsertMediaUpload.
например, MailResource.InsertMediaUpload (mailItem, "invalidEmail@domain.com", поток, "message/rfc822")

проблема

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

Вопросы
1) Каков наилучший способ выполнения алгоритма экспоненциального отката???
2) Это ожидаемое поведение для этого свойства в этом случае?
3) Существует ли еще GoogleApiRequestException, если да, то где?

Примечание:
Я также заметил, что класс 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-бета)

Единственный вопрос, который я обнаружил, касался моей проблемы: (Могу только опубликовать две ссылки... вот сырье)stackru.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] Неверный запрос [400]
[5224] Ошибки [
[5224] Сообщение [Bad Request] Местоположение [ - ] Причина [badRequest] Домен [global]
[5224]]
[5224] (T101) VSLLC: GoogleApiException-> Код статуса: 0
[5224] (T101) VSLLC: загрузка завершена... Статус: ошибка исключения: администратор службы выдал исключение: Google.GoogleApiException: Google.Apis.Requests.RequestError
[5224] Неверный запрос [400]
[5224] Ошибки [
[5224] Сообщение [Bad Request] Местоположение [ - ] Причина [badRequest] Домен [global]
[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. BackOffHandler оборачивает логику и реализует обработчик неудачных ответов и обработчик исключений.
  2. GoogleApiRequest больше не существует.
  3. Похоже, мы неправильно устанавливаем код состояния, как вы можете найти здесь. Я открываю новую проблему в нашем трекере, доступном здесь - https://code.google.com/p/google-api-dotnet-client/issues/detail?id=425. Не стесняйтесь добавлять больше контента к нему.
Другие вопросы по тегам