文档列出了用于C#超时的API客户端
我正在为c#中的google docs api编写一个简单的包装器。我遇到的问题是我的测试超时了。有时候。当我运行所有测试(只有12个)时,它通常会在第8个测试挂起,这是测试delete函数。大约6.5分钟后,它继续进行,但每次测试后,它也会在每次测试6.5分钟后超时。如果我单独运行测试,那么每次都可以正常工作 以下是超时的第一种方法:文档列出了用于C#超时的API客户端,c#,google-docs-api,C#,Google Docs Api,我正在为c#中的google docs api编写一个简单的包装器。我遇到的问题是我的测试超时了。有时候。当我运行所有测试(只有12个)时,它通常会在第8个测试挂起,这是测试delete函数。大约6.5分钟后,它继续进行,但每次测试后,它也会在每次测试6.5分钟后超时。如果我单独运行测试,那么每次都可以正常工作 以下是超时的第一种方法: public AtomEntryCollection GetDocuments(DocumentType type = DocumentType.All
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;
}
更新以显示异常处理
[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=service.Query(查询)代码>。如果我要求大量的文件,这将更接近可以接受。我不是。我要求5-6取决于我正在运行的测试
我尝试过的事情:
- 从我的google docs帐户中删除所有文件,只留下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:
另一次编辑
似乎我只是在第二次上传后请求文档数量后才崩溃。我不确定这是为什么,但我肯定会研究一下我的上传方法。您可以明确设置单元测试的超时。在这里,您可以获得有关它的详细信息:
您可以在出现问题的方法之前在单元测试中包括Thread.Sleep(毫秒)
。您的请求可能因为时间太短而被google文档拒绝。如果您的测试在单独运行时通过,但在连续运行时未通过,则您可能达到了请求速率限制。我注意到,在您对JotaBe回答的评论中,您提到了请求超时异常。您应该查看http状态代码来了解。对于503,您应该实现
更新建议
在引发异常的行周围放置一个try catch
,并捕获Google.GData.Client.GDataRequestException
。根据以下说明,有两个属性可能对您有价值:
/// <summary>
/// this is the error message returned by the server
/// </summary>
public string ResponseString
{ ... }
//
///这是服务器返回的错误消息
///
公共字符串应答器
{ ... }
及
//////////////////////////////////////////////////////////////////////
///响应的只读访问器
//////////////////////////////////////////////////////////////////////
公众网络响应
{ ... }
希望其中包含一些对您有用的信息,例如HTTP状态码。这肯定很有用,30秒等待测试失败的时间比6.5分钟要多得多。但我更想知道为什么我对谷歌的请求会出现web请求超时异常,而不是如何减少失败时间。对不起,如果我不清楚的话,我明天上班时会试试的。听起来可能是我正在寻找的东西,但也没用。我编辑了我的问题,以反映我不是经常坐在那里盯着我的测试等待其中一个失败,但现在他们都通过了,即使我确保在处理异常后抛出异常。希望它会再次失败,这样我可以从中获得一些信息。奇怪的是,当抛出异常时,测试会通过。您介意用try-catch代码更新您的答案吗?永远不会抛出异常。一切都很顺利。我不确定发生了什么,但我会更新我的问题