0

我正在尝试从每个 UploadAsync 方法调用中检索 HttpStatusCode。我需要状态码来正确执行指数退避算法以重试失败的上传,在不重试上传时向用户显示错误消息并报告上传成功。我不在乎它是如何接收的,只要它是干净的并且没有像 Tor Jonsson 在下面提供的链接中建议的那样从 Exception.Message (字符串)属性中解析出来。

为了强制“错误请求错误 [400]”,我只是在 MailResource.InsertMediaUpload 的构造函数中提供了一个无效的用户密钥(电子邮件)。
例如 MailResource.InsertMediaUpload(mailItem, "invalidEmail@domain.com" , stream, "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-beta)

我发现与我的问题有关的唯一问题:(只能发布两个链接......继承人原始) stackoverflow.com/questions/18985306/httpstatuscode-not-set-in-exceptions-when-using-google-net-apis

代码:(使用自定义记录器写入调试视图)

    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] 消息[错误请求] 位置 [-]原因 [badRequest] 域 [全局]
[5224] ]
[5224] (T101) VSLLC: GoogleApiException->状态代码: 0
[5224] (T101) VSLLC: 上传完成...状态: 异常失败?:服务管理员有抛出异常:Google.GoogleApiException: Google.Apis.Requests.RequestError
[5224] 错误请求 [400]
[5224] 错误 [
[5224] 消息[错误请求] 位置 [-] 原因 [badRequest] 域 [全局]
[5224 ] ]
[5224]
[5224] 在 Microsoft.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)
[5224] 在 Microsoft.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccess(任务任务)
[5224] 在 Microsoft.Runtime.CompilerServices.TaskAwaiter.ValidateEnd (任务任务)
[5224] 在 c:\code\google.com\google-api-dotnet-client\default\Tools\Google.Apis.Release 中的 Google.Apis.Upload.ResumableUpload`1.d__0.MoveNext() \bin\Debug\output\default\Src\GoogleApis\Apis[媒体]\Upload\ResumableUpload.cs:373 行


抱歉,这篇文章太宽泛了!谢谢你的时间!

4

1 回答 1

1
  1. 该库已经支持 503 响应的指数回退。如果出现 400(错误请求),您不应重试,因为您将一遍又一遍地得到相同的响应。查看服务初始化程序参数DefaultExponentialBackOffPolicy 您还可以查看我们的ExponentialBackOff 实现BackOffHandler包装了逻辑,实现了不成功的响应处理程序和异常处理程序。
  2. GoogleApiRequest 不再存在。
  3. 看起来我们没有正确设置状态码,你可以在这里找到。我在我们的问题跟踪器中打开了一个新问题,可在此处找到 - https://code.google.com/p/google-api-dotnet-client/issues/detail?id=425。随意添加更多内容。
于 2013-12-07T16:30:14.417 回答