文档列出了用于C#超时的API客户端

文档列出了用于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

我正在为c#中的google docs api编写一个简单的包装器。我遇到的问题是我的测试超时了。有时候。当我运行所有测试(只有12个)时,它通常会在第8个测试挂起,这是测试delete函数。大约6.5分钟后,它继续进行,但每次测试后,它也会在每次测试6.5分钟后超时。如果我单独运行测试,那么每次都可以正常工作

以下是超时的第一种方法:

    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代码更新您的答案吗?永远不会抛出异常。一切都很顺利。我不确定发生了什么,但我会更新我的问题