使用 C# MVC 的 GMail API 超出用户速率限制

Posted

技术标签:

【中文标题】使用 C# MVC 的 GMail API 超出用户速率限制【英文标题】:User-rate limit exceeded for GMail API using C# MCV 【发布时间】:2019-04-22 14:29:36 【问题描述】:

谁能帮我解决使用 C# MCV 应用程序超出 GMail API 的用户速率限制的解决方案。自过去 5 天以来,我一直坚持这一点。互联网上没有文件。谷歌也没有解决方案。我为访问谷歌服务启用了计费。使用类似...的代码

var certificate = new X509Certificate2(AssemblyDirectory + string.Format("\\0",CertificateFileName), CertificatePassword, X509KeyStorageFlags.Exportable);

ServiceAccountCredential credential = new ServiceAccountCredential(new ServiceAccountCredential.Initializer(ServiceAccountEmail)
               
                   Scopes = new[]  GmailService.Scope.GmailModify ,
                   User=this.User
               .FromCertificate(certificate));

 // Create the service.
 service = new GmailService(new BaseClientService.Initializer()
            
                HttpClientInitializer = credential,
                ApplicationName = this.ApplicationName,
                ApiKey="xxxxxxxxxxxxxxxxxxx",
            ); 

ListLabelsResponse response = service.Users.Labels.List("me").Execute();
Labels = response.Labels.ToList();
if (!Labels.Select(l => l.Name).Contains("Processed"))
    
         Labels.Add(CreateLabel("Processed"));
    

【问题讨论】:

【参考方案1】:

说明

用户速率限制错误消息是洪水保护。您作为服务帐户登录的当前用户每分钟/秒只能发出 X 次请求

如您所见,用户在 100 秒内最多可以进行 25,000 次查询。您的应用程序最多可以在 100 秒内发出 2,000,000 个请求。 Gmail 还存在一些其他限制,即记录到 mail sending,这些限制尚未记录在案。

当您达到用户速率限制配额时,除了减慢您的应用程序之外,您无能为力。

标准错误消息

403:超出用户速率限制 已达到每用户限制。这可能是来自开发者控制台的限制或来自云端硬盘后端的限制。


 "error": 
  "errors": [
   
    "domain": "usageLimits",
    "reason": "userRateLimitExceeded",
    "message": "User Rate Limit Exceeded"
   
  ],
  "code": 403,
  "message": "User Rate Limit Exceeded"
 

建议的操作:

使用指数退避。

403: 超出速率限制 用户已达到 Google Drive API 的最大请求率。限制因请求类型而异。


 "error": 
  "errors": [
   
    "domain": "usageLimits",
    "message": "Rate Limit Exceeded",
    "reason": "rateLimitExceeded",
   
  ],
  "code": 403,
  "message": "Rate Limit Exceeded"
 

建议的操作:

使用指数退避。

实现指数退避

指数退避是网络应用程序的标准错误处理策略,其中客户端会在越来越长的时间内定期重试失败的请求。如果大量请求或繁重的网络流量导致服务器返回错误,指数退避可能是处理这些错误的好策略。相反,它不是处理与速率限制、网络容量或响应时间无关的错误的相关策略,例如无效的授权凭据或找不到文件错误。

如果使用得当,指数退避可以提高带宽使用效率,减少获得成功响应所需的请求数量,并最大限度地提高并发环境中的请求吞吐量。

创建请求不是幂等的。简单的重试是不够的,可能会导致重复的实体。重试前检查实体是否存在。

计费

不可能提高他们那里的用户速率限制以防止开发人员淹没 Google 的服务器。 Gmail API 是免费的,使计费不会做太多。

注意

TBH 如果您通过Users.Labels.List("me") 得到此信息,我会感到惊讶,除非您为每个访问您网站的用户运行此代码,而不是缓存数据。

【讨论】:

以上是关于使用 C# MVC 的 GMail API 超出用户速率限制的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中使用 GMail API 创建标签

在 C# 中使用 GMail API 创建过滤器 [重复]

如何使用带有 OAuth 令牌的 Asp.Net MVC 中的 gmail API 更快地获取日期明智的电子邮件

在 c# 中使用 gmail API 修改消息标签时权限不足 [403] 错误

在 C# 中为 Gmail API 创建消息

带有 MimeKit、C# Winforms 和 Google API 的 Gmail 草稿(带附件的 HTML)