C# Google.api.Admin.Email_Migration_v2 HTTP 410返回503错误的状态代码

C# Google.api.Admin.Email_Migration_v2 HTTP 410返回503错误的状态代码,c#,.net,google-api,google-api-client,google-email-migration,C#,.net,Google Api,Google Api Client,Google Email Migration,本质上,当使用.NET版本的电子邮件迁移v2谷歌API时,我们的应用程序每秒向单个谷歌应用程序邮箱/用户发送的请求太多;每秒大于1个请求。正在返回一个GoogleApiException,这是正常的,并且是预期的,但是错误消息的主体表明发生了服务不可用(503)错误,但是同一GoogleApiException实例的“HttpStatusCode”属性等于Http状态码Gone(410),下面我将包括一个代码段和一些日志输出。此时,请参阅底部的问题部分或继续阅读以了解更多详细信息 哪些步骤会重现

本质上,当使用.NET版本的电子邮件迁移v2谷歌API时,我们的应用程序每秒向单个谷歌应用程序邮箱/用户发送的请求太多;每秒大于1个请求。正在返回一个GoogleApiException,这是正常的,并且是预期的,但是错误消息的主体表明发生了服务不可用(503)错误,但是同一GoogleApiException实例的“HttpStatusCode”属性等于Http状态码Gone(410),下面我将包括一个代码段和一些日志输出。此时,请参阅底部的问题部分或继续阅读以了解更多详细信息

哪些步骤会重现问题?

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

  • 创建一个Google.api.Admin.email\u migration\u v2.AdminService对象,使用OAuth2.0凭据正确初始化它
  • 对于需要发送到Google Apps的每封邮件,使用上面的AdminService对象,通过提供适当参数的AdminService.Mail.Insert()创建一个Google.API.Admin.email\u migration\u v2.MailResource.InsertMediaUpload实例
  • 捕获发生的任何错误时,调用MailResource.InsertMediaUpload.UploadAsync
  • 请执行以下操作:

  • 使用相同的OAuth2.0凭据,通过假脱机处理此进程/应用程序的数百个实例(所有实例都指向同一用户),开始以指数速率发送消息
  • 坐下来啜饮你的山露,等待[503]错误滚滚而来
  • 一旦出现错误,请关闭应用程序。。除了测试应用程序异常处理之外,无需对糟糕的Google服务器进行重击

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

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

    我们希望看到实例的HttpStatusCode属性等效于System.Net.HttpStatusCode.ServiceUnavailable,而不是System.Net.HttpStatusCode.Gone

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

    Google.api.Admin.Email_Migration_v2(1.8.1.20)

    您的操作系统是什么?

    Windows Server 2008 R2企业版(SP1)

    您的IDE是什么?

    Visual Studio 2013高级版

    什么是.NET framework版本?

    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方法处理的GoogleAppeException的转述输出:(注意使用自定义日志类; 输出到DebugView)

    **上下文信息**

    尝试将项目写入Gmail时出错

    **活动详情**

    VS EventID:30003(errgmailryupload)中处理的GoogleApiException Gmail Messenger.HandleUploadProgressExceptionHttpStatusCode:消失

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

    服务管理员引发了一个异常:Google.GoogleApiException: Google.api.Requests.RequestError

    服务不可用。请重试[503]

    错误[消息[服务不可用。请重试]位置[-] 原因[backendError]域[global]]

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

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

    在 Google.api.Upload.ResumableUpload`1.d_ue.MoveNext()

    问题:

  • 有人能解释一下这是预期行为还是bug吗
  • 如果这是预期结果,应用程序应如何处理基于410的错误?我知道,当遇到大多数(如果不是全部的话)400个错误时,该特定项的处理应该停止,但这似乎不是本地问题,而是服务器端问题

  • 非常感谢您的回复,我知道这样具体的问题很难回答。

    可能的、有用的提示、免责声明。。。在某种程度上,你应该得到一堆412极限达到的错误。通过使用此应用程序,我们收集到的信息是,每个Google Apps用户/邮箱都有一个挂起的邮件队列,当您发送邮件时,邮件首先放入此队列,然后由Google服务器处理并放入用户邮箱。如果此队列已满,并且您尝试发送另一条消息,您将收到412错误。选项是在发送另一条消息之前等待,您必须等待Google Apps服务器处理队列中的下一条消息所需的时间,然后再发送另一条消息。或者开始发送给另一个用户,因为队列是按用户的。我们花了一点时间才弄明白,如果你有这个问题,干杯。注意,在抛出412个错误之前,挂起的消息队列似乎包含大约100-150个项目。503仅当以每秒1个请求的更高速率向队列发送邮件到一个用户的邮箱时,才会发生错误。这不是对您问题的回答,但请注意电子邮件迁移API已弃用,并已被Gmail API取代。现在针对电子邮件迁移API v2编写的任何代码都不会有很长的使用寿命。。我很感激你的评论,很久没有访问API的主页了,因为没有必要。我处理大量的应用程序,所以我并不总是有时间专注于某个特定的应用程序。令人惊讶的是,我的同事们也不知道,一些如此简单的事情被忽略了这么久。。。我应该想到一些事情发生了,因为自去年11月以来,NuGet软件包没有更新。。。我真的很感激你指出这一点!使沮丧