0

本质上,在使用 .NET 版本的 Email Migration v2 Google API 时,我们的应用程序每秒向单个 Google Apps 邮箱/用户发送太多请求;大于每秒 1 个请求。返回的 GoogleApiException 很好,并且是预期的,但是错误消息的正文指出发生了服务不可用 (503) 错误,但是同一 GoogleApiException 实例的“HttpStatusCode”属性等于 Http 状态代码走了(410),我将在下面包含一个代码片段和一些日志输出。此时,请参阅底部的问题部分或继续阅读以获取更多详细信息。

哪些步骤将重现该问题?

创建执行以下操作的进程/应用程序:

  1. 创建一个 Google.Apis.Admin.email_migration_v2.AdminService 对象,使用您的 OAuth2.0 凭据正确初始化它。
  2. 对于需要发送到 Google Apps 的每条消息,通过使用 AdminService.Mail.Insert() 提供适当的参数,使用上面的 AdminService 对象创建一个 Google.Apis.Admin.email_migration_v2.MailResource.InsertMediaUpload 实例。
  3. 在捕获发生的任何错误时调用 MailResource.InsertMediaUpload.UploadAsync。

请执行下列操作:

  1. 通过使用相同的 OAuth2.0 凭据假脱出数百个指向同一个用户的进程/应用程序实例,开始以指数速率发送消息。
  2. 坐下来啜饮你的山露,等待 [503] 错误出现......

一旦错误开始滚动关闭您的应用程序.. 除了测试应用程序异常处理之外,无需敲击糟糕的谷歌服务器..

什么是预期的输出?你看到了什么呢?

使用以下类型的实例:Google.GoogleApiException

人们会期望看到实例的 HttpStatusCode 属性等同于 System.Net.HttpStatusCode.ServiceUnavailable 而不是 System.Net.HttpStatusCode.Gone

您使用的是什么版本的产品?

Google.Apis.Admin.Email_Migration_v2 (1.8.1.20)

你的操作系统是什么?

Windows Server 2008 R2 企业版 (SP1)

你的IDE是什么?

Visual Studio 2013 高级版

.NET 框架版本是什么?

4.0.30319

请在下面提供任何附加信息。

以下是为上传目的而调用的方法的代码片段:

    UploadStatus TryUpload(MailResource.InsertMediaUpload insertMediaUpload)
    {
        try
        {
            IUploadProgress uploadProgress = insertMediaUpload.UploadAsync(_cancellationToken).Result; // Task.Result locks this thread until completed.

            if (uploadProgress != null && uploadProgress.Exception != null)
            {
                // Display additional information on any of the various exceptions that can be returned by the upload call.
                HandleUploadProgressException(uploadProgress);
            }

            return uploadProgress != null ? uploadProgress.Status : UploadStatus.Failed;

这是显示异常输出的方法的代码片段。

    void HandleUploadProgressException(IUploadProgress uploadProgress)
    {
        if (uploadProgress.Exception is GoogleApiException)
        {
            GoogleApiException gApiEx = uploadProgress.Exception as GoogleApiException;
            throw new vsEventException(vsMapEvent.MapHttpError(gApiEx.HttpStatusCode, vsEventMessages.Id.errGmailUnidentifiableGoogleApiException),
                String.Format("GoogleApiException handled in GmailMessenger.HandleUploadProgressException.  HttpStatusCode: {0}", gApiEx.HttpStatusCode),
                gApiEx);
        }

这是由 HandleUploadProgressException 方法处理的 GoogleApiException 的释义输出:(注意使用自定义日志记录类;输出到 DebugView)

** 上下文信息 **

尝试将项目写入 Gmail 时出错...

** 活动详情 **

VS-EventID: 30003(errGmailTryUpload) 在 GmailMessenger.HandleUploadProgressException 中处理的 GoogleApiException。 HttpStatusCode:消失

** 内部异常详细信息 **

服务管理员抛出异常:Google.GoogleApiException: Google.Apis.Requests.RequestError

暂停服务。请再试一次 [503]

错误[消息[服务不可用。请重试] Location[ - ] Reason[backendError] Domain[global] ]

在 Microsoft.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)

在 Microsoft.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccess(任务任务)

在 Google.Apis.Upload.ResumableUpload`1.d__e.MoveNext()

问题:

  1. 如果这是预期的行为还是错误,任何人都可以解释一下吗?
  2. 如果这是预期结果,应用程序应如何处理基于 410 的错误?我知道当遇到大多数(如果不是全部)400 错误时,该特定项目的处理应该停止,但这似乎不是本地问题,更多的是服务器端问题。

我很感激任何回复,我知道像这样具体的问题可能很难。

4

0 回答 0