文档列表 C# 的 API 客户端超时

本文关键字:客户端 超时 API 列表 文档 | 更新日期: 2023-09-27 18:33:29

我正在为C#中的Google Docs api开发一个简单的包装器。我遇到的问题是我的测试超时了。有时。当我运行所有测试(只有 12 个(时,它通常会在第 8 个测试上挂起,即测试 delete 函数。大约 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: 

另一个编辑

似乎我只是在第二次上传后请求文档数量后崩溃。我不确定为什么会这样,但我肯定会研究我的上传方法。

文档列表 C# 的 API 客户端超时

如果您的测试在单独运行时通过,但在连续运行时未通过,则您可能达到了请求速率限制。 我注意到您在对JotaBe的回答的评论中,您提到请求超时异常。 您应该查看http状态代码以找出该怎么做。 在 503 的情况下,您应该实现异常退避。

更新的建议

在引发异常的行周围放置一个try-catch并捕获Google.GData.Client.GDataRequestException。 根据消息来源,有两个属性可能对您有价值:

    /// <summary>
    /// this is the error message returned by the server
    /// </summary>
    public string ResponseString
    { ... }

    //////////////////////////////////////////////////////////////////////
    /// <summary>Read only accessor for response</summary>
    //////////////////////////////////////////////////////////////////////
    public WebResponse Response
    { ... }

希望这些包含一些对您有用的信息,例如HTTP状态代码。

可以显式设置单元测试的超时。在这里,您可以获得有关它的大量信息:

  • 如何:设置运行测试的时间限制

可以在有问题的方法之前在单元测试中包含Thread.Sleep(miliseconds)。可能您的请求被谷歌文档拒绝了,因为太可能在太短的时间内。