【问题标题】:.Net C# RESTSharp 10 Minute Timeout.Net C# RESTSharp 10 分钟超时
【发布时间】:2019-01-24 16:11:33
【问题描述】:

我已将浏览器控件嵌入到 .Net 表单中,并将其编译为窗口的可执行文件。浏览器控件正在显示我们的 HTML5 图像查看器。应用程序打开套接字,以便它可以侦听来自各种服务器的“推送”请求。这允许将图像推送到单个用户的桌面。

当传入的图像推送请求进来时,应用程序使用 RESTSharp 调用 REST 服务来生成一个令牌,供查看者用来显示图像。

只要请求始终如一地到达,一切都会很好。如果有一个停顿(似乎是 10 分钟的时间范围),那么 RESTSharp 请求就会超时。几乎就好像创建 RESTSharp 工件的新实例正在尝试 .Net 优化中重用旧实例。

这是我正在使用的 RESTSharp 代码:

private async Task<string> postJsonDataToUrl(string lpPostData) {
    IRestClient client = new RestClient(string.Format("{0}:{1}", MstrScsUrlBase, MintScsUrlPort));
    IRestRequest request = new RestRequest(string.Format("{0}{1}{2}", MstrScsUrlContextRoot, MstrScsUrlPath, SCS_GENERATE_TOKEN_URL_PATH));
    request.Timeout = 5000;
    request.ReadWriteTimeout = 5000;
    request.AddParameter("application/json", lpPostData, ParameterType.RequestBody);

    IRestResponse response = await postResultAsync(client, request);
    return response.Content;
} // postJsonDataToUrl

private static Task<IRestResponse> postResultAsync(IRestClient client, IRestRequest request) {
    return client.ExecutePostTaskAsync(request);
} // PostResultAsync

这是发生超时的行:

    IRestResponse response = await postResultAsync(client, request);

我尝试使用 .Net 的 HttpWebRequest 重写它,但遇到了同样的问题。

如果我延长 RESTSharp 超时,我可以在应用程序“超时”时调用服务器(使用不同的客户端),所以我知道服务器不是问题。

代码的初始版本没有 await 异步调用结构 - 添加它是为了尝试获取有关该问题的更多信息。

除了 REST 超时,我没有收到任何错误。

我在通过这个调用强制垃圾收集方面取得了有限的成功:

GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);

有什么想法吗?

【问题讨论】:

    标签: c# .net rest restsharp


    【解决方案1】:

    您可能正在达到 .Net 应用程序的连接限制,如 MS 文档中所示:

    “默认情况下,使用 HttpWebRequest 类的应用程序最多使用两个到给定服务器的持久连接,但您可以根据每个应用程序设置最大连接数。”

    (https://docs.microsoft.com/en-us/dotnet/framework/network-programming/managing-connections).

    关闭连接应该会有所帮助,或者您可以增加该限制,这也在文档中

    【讨论】:

    • 有趣。好想法。不幸的是 - 它对我的问题没有帮助,但它可能会帮助其他人。谢谢
    【解决方案2】:

    我最终选择了

    GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);
    

    在每 2 分钟触发一次的计时器中。这完全解决了我的问题。

    这让我非常惊讶,因为我的 HttpWebRequest 代码被包装在“使用”语句中,因此资源应该已经被正确释放。我只能得出结论,.Net 正在优化类的使用,并试图重用一个陈旧的类,而不是让我从头开始创建一个新类。

    【讨论】:

      【解决方案3】:

      一种新的做事方式。

          var body = @"{ ""key"": ""value"" }";
      
          // HTTP package
          var request = new RestRequest("https://localhost:5001/api/networkdevices", Method.Put);
          request.AddHeader("Content-Type", "application/json");
          request.AddHeader("Keep-Alive", "");// set "timeout=120" will work as well
          request.Timeout = 120;
          request.AddBody(body);
      
          // HTTP call
          var client = new RestClient();
          RestResponse response = await client.ExecuteAsync(request);
      
          Console.WriteLine(response.Content);
      

      【讨论】:

        猜你喜欢
        • 2023-03-27
        • 2013-06-15
        • 2021-03-04
        • 1970-01-01
        • 2023-01-26
        • 2012-08-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多