Появляется SocketException при подключении
Каждые 10 секунд подключаюсь к сервису на удаленном компьютере, получаю нужные мне данные и закрываю соединение. Но периодически появляется исключение:
"SocketException: Попытка установить соединение была безуспешной, т.к. от другого компьютера за требуемое время не получен нужный отклик, или было разорвано уже установленное соединение из-за неверного отклика уже подключенного компьютера...."
Из-за этого программа на некоторое время подвисает, что не очень приятно. Подскажите пожалуйста, как можно правильно обработать исключение чтобы избавиться от подвисаний и программа работала стабильно? Брандмауэры везде полностью отключены
try
{
WebRequest request = WebRequest.Create("http://xxx.xxx.xxx.xxx:xxxx/api/xxxxx/xxx");
WebResponse response = request.GetResponse();
string line = "";
string value = line;
using (Stream stream = response.GetResponseStream())
{
using (StreamReader reader = new StreamReader(stream))
{
while ((line = reader.ReadLine()) != null)
{
value = line;
}
}
}
response.Close();
}
catch
{
}
Ответы (1 шт):
1) Очень странная реализация, в читаете строку из Stream и при этом если в нем более одной строки, то перезаписываете постоянно эту строку следующей, и так далее до окончания стрима.
2) Следующая проблема, вы не освобождаете ресурсы. Для IDisposable классов WebRequest и WebResponse нужно либо применять using, либо вызывать Dispose(). Подробнее читайте в документации.
3) Потом, WebRequest устарел, и очень давно.
Не рекомендуется использовать
WebRequestили производные классы для новой разработки. Вместо этого используйте классSystem.Net.Http.HttpClient.
4) Чтобы все не подвисало, пока идет загрузка из сети, следует использовать асинхронность. Вот пример асинхронного получения строчки по сети через HTTP(S).
Вы не указали, WPF у вас, WinForms, или консоль, поэтому попробую дать простое и универсальное решение.
// HttpClient создается один раз на все время работы программы.
private static HttpClient client = new HttpClient();
А использовать HttpClient можно из обычного синхронного кода например так. Все методы HttpClient асинхронные, ну потому что синхронные запросы в сеть - это бессмысленно.
Task.Run(async () =>
{
string result = await client.GetStringAsync("http://xxx.xxx.xxx.xxx:xxxx/api/xxxxx/xxx");
// ответ получен, сделайте здесь что-то с result.
});
или из асинхронного обработчика события (допустим, у вас WPF)
private async void Button_Click(object sender, RoutedEventArgs e)
{
string result = await client.GetStringAsync("http://xxx.xxx.xxx.xxx:xxxx/api/xxxxx/xxx");
// ответ получен, сделайте здесь что-то с result
}
Не забудьте обработать исключения, так как в процессе получения данных от сервера они могут возникнуть.