我正在构建一个向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次运行之后)。据我所知,这不能过度使用。
接下来要尝试什么?