本质上,在使用 .NET 版本的 Email Migration v2 Google API 时,我们的应用程序每秒向单个 Google Apps 邮箱/用户发送太多请求;大于每秒 1 个请求。返回的 GoogleApiException 很好,并且是预期的,但是错误消息的正文指出发生了服务不可用 (503) 错误,但是同一 GoogleApiException 实例的“HttpStatusCode”属性等于 Http 状态代码走了(410),我将在下面包含一个代码片段和一些日志输出。此时,请参阅底部的问题部分或继续阅读以获取更多详细信息。
哪些步骤将重现该问题?
创建执行以下操作的进程/应用程序:
- 创建一个 Google.Apis.Admin.email_migration_v2.AdminService 对象,使用您的 OAuth2.0 凭据正确初始化它。
- 对于需要发送到 Google Apps 的每条消息,通过使用 AdminService.Mail.Insert() 提供适当的参数,使用上面的 AdminService 对象创建一个 Google.Apis.Admin.email_migration_v2.MailResource.InsertMediaUpload 实例。
- 在捕获发生的任何错误时调用 MailResource.InsertMediaUpload.UploadAsync。
请执行下列操作:
- 通过使用相同的 OAuth2.0 凭据假脱出数百个指向同一个用户的进程/应用程序实例,开始以指数速率发送消息。
- 坐下来啜饮你的山露,等待 [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()
问题:
- 如果这是预期的行为还是错误,任何人都可以解释一下吗?
- 如果这是预期结果,应用程序应如何处理基于 410 的错误?我知道当遇到大多数(如果不是全部)400 错误时,该特定项目的处理应该停止,但这似乎不是本地问题,更多的是服务器端问题。
我很感激任何回复,我知道像这样具体的问题可能很难。