多次成功请求后,Google apis DirectoryService会返回403

时间:2014-03-07 15:11:10

标签: c# web-services google-api http-status-code-403 google-api-dotnet-client

我正在构建一个向Google发送用户信息的网络服务。一切正常,直到我做多个请求。在10-20次成功请求后失败。

作为登录方式,我使用Google Service Account

这是用于测试服务请求的代码。

while (i < 1000)
{
    Console.WriteLine("================== Start run "+ i + " =======================");

    String serviceAccountEmail = "#####@developer.gserviceaccount.com";
    X509Certificate2 certificate = new X509Certificate2(@"pathtocert", "notasecret", X509KeyStorageFlags.Exportable);

    ServiceAccountCredential credential = new ServiceAccountCredential(
        new ServiceAccountCredential.Initializer(serviceAccountEmail)
        {
            Scopes = new[] { 
                DirectoryService.Scope.AdminDirectoryUser.ToString(), DirectoryService.Scope.AdminDirectoryUserReadonly.ToString(),
                DirectoryService.Scope.AdminDirectoryGroup.ToString(), DirectoryService.Scope.AdminDirectoryGroupReadonly.ToString(),
                DirectoryService.Scope.AdminDirectoryOrgunit.ToString()
            },
            User = "admin@gmail.com"
        }.FromCertificate(certificate)
    );
    DirectoryService service = new DirectoryService(new BaseClientService.Initializer() { HttpClientInitializer = credential, ApplicationName = "Bla" });

    UsersResource.GetRequest req = service.Users.Get("test@test.com");
    req.Alt = UsersResource.GetRequest.AltEnum.Json;
    Google.Apis.Admin.Directory.directory_v1.Data.User test = req.Execute();

    Console.WriteLine("ID: " + test.Id);
    Console.WriteLine("Name: " + test.Name.FullName);
}

如果我将服务的创建放在while循环之外,代码运行正常。当它在循环内部时,它会在一些循环后失败。服务给出的是:

  

Google.Apis.dll中出现未处理的“Newtonsoft.Json.JsonReaderException”类型的异常附加信息:解析值时遇到意外的字符:&lt;。路径'',第0行,第0位。

有人可以帮我一把吗?我没有得到错误,也没有理解为什么代码有时会工作,有时会失败。

更新再次完成一些测试运行,发现BaseClientService.Initializer是给出错误的部分。我也使用fiddler来解密服务响应。这部分解释了json解析错误,因为该服务返回一个网页。该页面包含以下消息:

  

403。这是一个错误。    很抱歉,您无法访问此页面。这就是我们所知道的。

过了一段时间,谷歌阻止了我的请求。我的问题是为什么,如果服务需要JSON响应,为什么要发送网页?

更新在Alex的提示之后我查看了api的最大请求,但api的限制默认为15请求/秒。该应用程序永远不会激发这么多请求。为了确保我将限制设置为50请求/秒,但这并没有改变任何东西。

更新与谷歌联系后再次查看最大请求。最大用户请求为10请求/秒。因此,为了确保应用程序没有过度使用此配额,我在每次5秒的请求后建立超时,但是在多次循环之后我仍然得到相同的错误(这次是在17次运行之后)。据我所知,这不能过度使用。

接下来要尝试什么?

0 个答案:

没有答案