HttpWebRequest не возвращается, закрытие соединения
-
03-07-2019 - |
Вопрос
У меня есть веб-приложение, которое опрашивает веб-службу на другом сервере.Сервер расположен в той же сети и на него ссылается внутренний IP-адрес, работающий на порту 8080.
Каждые 15 секунд отправляется запрос, на который приходит ответ в формате XML с информацией о задании.В 95% случаев это работает хорошо, однако в случайные моменты запрос к серверу имеет нулевой результат и сообщает об «ответе, принудительно закрытом удаленным хостом».
Исследуя эту проблему, другие установили KeepAlive = false.Это не решило проблему.Веб-сервер работает под управлением .NET 3.5 SP1.
Uri serverPath = new Uri(_Url);
// create the request and set the login credentials
_Req = (HttpWebRequest)WebRequest.Create(serverPath);
_Req.KeepAlive = false;
_Req.Credentials = new NetworkCredential(username, password);
_Req.Method = this._Method;
Звонок в ответ:
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
_ResponseStream = response.GetResponseStream();
Для этого используется метод GET.Я попытался изменить тайм-аут, но значение по умолчанию достаточно велико, чтобы это принять во внимание.
Другой запрос, который мы выполняем, — это POST для отправки данных на сервер, и мы также случайно сталкиваемся с той же проблемой.На это не влияют брандмауэры, и мы исключили антивирусный сканер.Любые идеи, которые помогут решить эту проблему, очень ценятся!
Решение
Вы закрываете поток ответов и удаляете сам ответ?Это наиболее частая причина «зависаний» WebRequest — существует ограничение на количество подключений, которые вы можете открыть к одному и тому же компьютеру одновременно.Со временем GC завершит соединения, но если вы правильно их расположите, это не проблема.
Другие советы
Я бы не исключал проблемы с сетью как возможную причину проблем.Выполнили ли вы проверку связи с вашим сервером, чтобы увидеть, получаете ли вы отброшенные пакеты, соответствующие тому же времени, что и ваши неудачные запросы?
Установите для свойства таймаута объекта FtpWebRequest максимальное значение. Я попробовал это с файлом размером 4 ГБ, и он работает отлично.