Google.Apis.Admin.Email_Migration_v2针对503错误返回的HTTP 410状态代码

时间:2015-03-11 20:18:54

标签: c# .net google-api google-api-client google-email-migration

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

哪些步骤会重现此问题?

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

  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。
  4. 执行以下操作:

    1. 使用相同的OAuth2.0凭据,通过假脱机指向同一用户的数百个此进程/应用程序实例,开始以指数级别发送邮件。
    2. 坐下来啜饮你的山露,等待[503]错误滚滚......
    3. 一旦错误开始滚动,关闭你的应用程序..除了测试应用程序异常处理之外,不需要锤击糟糕的Google服务器..

      预期产量是多少?你怎么看?

      使用以下类型的实例: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 Enterprise(SP1)

      您的IDE是什么?

      Visual Studio 2013 Premium

      什么是.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)处理GoogleApiException   GmailMessenger.HandleUploadProgressException。 HttpStatusCode:Gone

           

      **内部异常详情**

           

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

           

      服务不可用。请再试一次[503]

           

      错误[消息[服务不可用。请再试一次]位置[ - ]   原因[backendError]域[全局]]

           

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

           

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

           

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

      问题:

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

0 个答案:

没有答案