.Net C # RESTSharp 10 минутный тайм-аут - PullRequest
0 голосов
/ 24 января 2019

Я встроил элемент управления браузера в форму .Net и скомпилировал его как исполняемый файл окна.Элемент управления браузера отображает наш просмотрщик изображений HTML5.Приложение открывает сокеты, чтобы оно могло прослушивать «push» запросы от различных серверов.Это позволяет передавать изображения на рабочие столы отдельных пользователей.

Когда поступает входящий push-запрос изображения, приложение вызывает службу REST, используя RESTSharp, чтобы сгенерировать токен, который зритель может использовать для отображения изображения.

Пока запросы постоянно поступают, все работает отлично.Если наступает затишье (кажется, 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 голосов
/ 28 января 2019

Я закончил тем, что положил

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

в таймер, который срабатывал каждые 2 минуты.Это полностью решило мою проблему.

Это меня очень удивило, поскольку мой код HttpWebRequest был заключен в операторы «using», поэтому ресурсы должны были быть освобождены должным образом.Я могу только сделать вывод, что .Net оптимизировал использование класса и пытался повторно использовать устаревший класс, а не позволять мне создавать новый с нуля.

0 голосов
/ 24 января 2019

Возможно, вы превысили лимит подключения для приложений .Net, как в документах MS:

"По умолчанию приложение, использующее класс HttpWebRequest, использует максимум два постоянных соединения с данным сервером, но вы можете установить максимальное количество соединений для каждого приложения."

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

Закрытие соединений должно помочь, или вы можете увеличить этот лимит, который также есть в документе

...