.Net C#RESTSharp 10分钟超时

时间:2019-01-24 16:11:34

标签: c# .net rest restsharp

我已经将浏览器控件嵌入到.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超时时间,则能够在应用程序“定时”时调用服务器(使用其他客户端),因此我知道服务器不是问题。

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

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

通过此调用强制垃圾回收的成功率有限:

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

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分:0)

我最终放下

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

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

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