【发布时间】:2014-09-29 19:41:47
【问题描述】:
编辑 2:
客户端库:经过审查,不容易认为这是针对 .NET 客户端库的。
DLL: Google.Apis.Admin.email_migration_v2.dll
哪些步骤会重现问题?
-
生成一个包含 每个 Google.Apis.Admin.email_migration_v2.AdminService 实例 将向其发送邮件的唯一 Google Apps Gmail 邮箱。 生成的所有 AdminService 对象都使用相同的 OAuth2.0 凭据和应用程序名称。生成的每个 AdminService 对象 只会将消息发送到一个 Google Apps 用户的邮箱。为了 例如,如果我们向五个不同的 Google Apps 发送消息 我们将生成五个 AdminService 对象来发送的 Gmail 邮箱 消息;每个用户的邮箱一个。
最需要注意的是,创建的每个 AdminService 对象都是在单独的进程上创建的。
AdminService 对象被赋予一个 FileDataStore 对象来更改刷新令牌的存储位置; C:\ProgramData\SomeFile\SomeFile.
为凭据提供了适当的范围。
-
开始在每个进程上发送邮件消息。每个进程使用一个线程发送消息,因此每次只发送一条消息到每个用户的邮箱。
发送的每条消息都有自己的 MailItem 和 MailResource.InsetMedia 实例
通过调用 AdminService.Mail.Insert(MailItem, string, Stream, string) 方法为每个项目生成 MailResource.InsertMedia 对象。
-
当我们的代码调用 MailResource.InsertMediaUpload.UploadAsync(CancellationTokenSource).Result 时,我们会收到错误消息。
- 从上述调用的返回类型中捕获并处理(记录)错误;类型是 Google.Apis.Upload.IUploadProgress。使用 IUploadProgress.Exception 属性处理异常。
预期的输出是什么?你看到了什么?
-
预期的输出将是成功的消息响应或任务返回后 IUploadProgress 的异常属性为空。相反,我们收到以下错误消息:
服务管理员抛出异常: Google.GoogleApiException:Google.Apis.Requests.RequestError
已达到限制。 [412] 错误 [消息[达到限制。] 位置[If-Match - 标头] 原因[conditionNotMet] 域[全局]]
在 Microsoft.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)
在 Microsoft.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccess(任务任务)
在 Google.Apis.Upload.ResumableUpload`1.d__e.MoveNext()
您使用的是什么版本的产品?
- Google.Apis.Admin.Email_Migration_v2 (1.8.1.20)
您的操作系统是什么?
- Windows Server 2008 R2 企业版 (SP1)
你的 IDE 是什么?
- Visual Studio 2013 高级版
.NET 框架版本是什么?
- 4.0.30319
请在下方提供任何其他信息。
非连续消息可能会失败(带有 412 http 状态代码 上面提供)在发送消息的过程中。一旦我们 收到此错误消息失败后发送的其他消息 可以成功。 (项目在此过程中的任何时候都可能失败 开头、中间或结尾。)
发送的每条消息都有几乎相同的内容。的大小 消息范围从 1KB 到 100KB,包括所有关联的大小 附件,并非所有邮件都有附件。
稍后重新处理失败的项目会导致成功 消息响应和适当的项目被发送到用户的 Google Apps Gmail 收件箱。
Google Apps 用户的邮箱最多发送到一个 时间是十点。
-
检查我们的 Google Developers Console 项目的配额后:
对于每秒 20 个请求的指定限制,我们还差得很远 电子邮件迁移 API;每秒最多发送 7 个请求。
仅达到每日最大请求的 2%。
所有发送的消息都有相同的标签;标签正好在 225 个字符限制。实际上应用了所有标签/子标签 加起来只超过 40 个字符。
仅发送到一个时仍会收到此错误消息 Google Apps 用户的邮箱;只使用一个进程和一个线程。
每个进程通常发送 1000-5000 条消息。
我没有找到很多具体的文档来足够详细地解释这个特定的错误来解决手头的问题。
问题:
- 那么这个 412 http 状态码到底是什么意思呢?此消息所指的限制是什么?
- 如果我们达到限制,我们是否应该从服务器收到某种形式的 5XX 错误?在这种情况下,内置的指数回退策略不会启动吗?
- 一个。除非服务器正在检查 POST 请求以获取有关服务器端限制的先决条件,否则会告诉客户端后退,这似乎是 412 错误通常表明的内容。在这种情况下,请尽可能详细地说明问题 1。
抱歉,这篇文章太长了!谢谢你的时间!我还将在 Google 的 .NET 问题跟踪器中创建一个缺陷/问题并提供一个链接。
编辑 1:
对于有兴趣关注此问题的任何人,此处是指向 Google 的 .NET 问题跟踪器中已提交项目的链接。 Submitted Issue
供参考,这是第 492 期。
【问题讨论】:
标签: c# .net google-api google-api-dotnet-client google-email-migration