【发布时间】: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);
有什么想法吗?
【问题讨论】: