我正在为 c# 中的 google docs api 开发一个简单的包装器。我遇到的问题是我的测试超时。有时。当我运行所有测试(只有 12 个)时,它通常会在第 8 个测试删除功能时挂断。大约 6.5 分钟后,它会继续,但之后的每次测试也会在每次测试的 6.5 分钟后超时。如果我单独运行测试,那么每次都可以正常工作。
这是第一个超时的方法:
更新以显示异常处理
[TestMethod]
public void CanDeleteFile()
{
var api = CreateApi();
api.UploadFile("pic.jpg", "..\\..\\..\\pic.jpg", "image/jpeg");
try
{
var files = api.GetDocuments();
api.DeleteFile("pic.jpg");
var lessFiles = api.GetDocuments();
Assert.AreEqual(files.Count - 1, lessFiles.Count);
}
catch (Google.GData.Client.GDataRequestException ex)
{
using (StreamWriter writer = new StreamWriter("..\\..\\..\\errors.log", true))
{
string time = DateTime.Now.ToString();
writer.WriteLine(time + ":\r\n\t" + ex.ResponseString);
}
throw ex;
}
}
它在var lessFiles = api.GetDocuments();
第二次调用该方法时超时。我有其他方法调用该方法两次,它们不会超时,但这个会。
所有测试方法使用的超时方法:
public AtomEntryCollection GetDocuments(DocumentType type = DocumentType.All, bool includeFolders = false)
{
checkToken();
DocumentsListQuery query = getQueryByType(type);
query.ShowFolders = includeFolders;
DocumentsFeed feed = service.Query(query);
return feed.Entries;
}
它在这条线上超时DocumentsFeed feed = service.Query(query);
。如果我请求疯狂数量的文件,这将更接近可接受。我不是。我要求 5 - 6,具体取决于我正在运行的测试。
我尝试过的事情:
- 从我的谷歌文档帐户中删除所有文件,只留下 1-2 个文件,具体取决于要检索的测试。
- 单独运行测试(它们都通过并且没有超时,但我不应该这样做)
- 检查我的网络速度以确保它不是非常慢(15mbps 下降 4.5mbps 上升)
我没主意了。如果有人知道为什么它可能会开始对我超时?欢迎任何建议。
编辑
正如@gowansg 建议的那样,我在我的代码中实现了指数退避。它在同一点开始失败,但出现同样的异常。然后我编写了一个测试来发送 10000 个请求,以获取驱动器中所有文档的完整列表。它在没有使用指数退避的情况下顺利通过。接下来我修改了我的测试类,以便跟踪发送了多少请求。我的测试在请求 11 时崩溃。
完整的例外:
Google.GData.Client.GDataRequestException was unhandled by user code
Message=Execution of request failed: https://docs.google.com/feeds/default/private/full
Source=GoogleDrive
StackTrace:
at GoogleDrive.GoogleDriveApi.GetDocuments(DocumentType type, Boolean includeFolders) in C:\Users\nlong\Desktop\projects\GoogleDrive\GoogleDrive\GoogleDriveApi.cs:line 105
at GoogleDrive.Test.GoogleDriveTests.CanDeleteFile() in C:\Users\nlong\Desktop\projects\GoogleDrive\GoogleDrive.Test\GoogleDriveTests.cs:line 77
InnerException: System.Net.WebException
Message=The operation has timed out
Source=System
StackTrace:
at System.Net.HttpWebRequest.GetResponse()
at Google.GData.Client.GDataRequest.Execute()
InnerException:
另一个编辑
似乎我只有在第二次上传后请求文档数量后才会崩溃。我不确定为什么会这样,但我肯定会研究我的上传方法。