Невозможно прочитать данные из транспортного соединения: существующее соединение было принудительно закрыто удаленным хостом в C#
У меня есть код, где я отправляю запрос URL и получаю ответ и сохраняю его как строку как
public String GenerateXML(String q)// Here 'q' is the URL
{
// Generating the XML file for reference
// Getting the response in XML format from the URL
Debug.WriteLine("The Http URL after URL encoding :" + q);
try
{
Uri signs1 = new Uri(q);
//Debug.WriteLine("The Requested URL for getting the XML data :" + re);
WebRequest request1 = WebRequest.Create(signs1);
HttpWebResponse response1 = (HttpWebResponse)request1.GetResponse();
//HttpWebResponse response1 = (HttpWebResponse)request1.GetResponse();
Stream receiveStream = response1.GetResponseStream();
StreamReader readStream = new StreamReader(receiveStream, Encoding.UTF8);
String ab = readStream.ReadToEnd();// The mentioned error is showing up here.
// Debug.WriteLine("The data :"+a);
//XmlDocument content2 = new XmlDocument();
// content2.LoadXml(ab);
// content2.Save("C:/Users/Administrator/Downloads/direct.xml");
return ab;
}
catch (System.Net.WebException ex)
{
Debug.WriteLine("Exception caught :" + ex);
return null;
}
}
Почему соединение закрыто удаленным хостом? Каковы возможности избавления от ошибки или, по крайней мере, игнорирования ошибки и продолжения других URL-запросов? Я включил try и catch, чтобы избежать любой ошибки и продолжить работу без остановки. Разыскивал интернет для решения, но решения этой конкретной проблемы довольно специфичны. Пожалуйста, любая помощь приветствуется. Заранее спасибо.
2 ответа
Фактическое исключение, вероятно, IOException
- вам нужно поймать этот тип исключения, а также WebException
, Фактическая проблема может заключаться в том, что ваш URL устарел, и в системе больше не работает веб-сервер, или, возможно, запрос должен быть аутентифицирован или нуждается в заголовке, как предполагает @LB.
Кроме того, вы можете утекать все виды ресурсов. Вы должны обернуть ваш WebResponse и потоки в using
заявления.
using (var response = (HttpWebResponse)request.GetResponse())
using (var receiveStream = response.GetResponseStream())
using (var reader = new StreamReader(receiveStream))
{
var content = reader.ReadToEnd();
// parse your content, etc.
}
У меня были похожие проблемы с принудительным закрытием соединения с разными хостами. Кажется, проблема может быть решена путем изменения различных свойств WebRequest
объект.
Следующие выводы были изложены в сообщении в блоге briancaos: существующее соединение было принудительно закрыто удаленным хостом
Шаги, упомянутые в приведенном выше сообщении, включают в себя:
Задавать WebRequest.KeepAlive
в False
,
Задавать WebRequest.ProtocolVersion
в HttpVersion.Version10
,
Задавать WebRequest.ServicePoint.ConnectionLimit
в 1
Это действительно работает для меня, но я еще не тестировал его на нескольких хостах. Тем не менее, я серьезно предлагаю прочитать этот пост, поскольку он становится более подробным.
В случае, если ссылка не работает, вот кешированная версия Archive.org.
У меня была та же проблема сегодня, поэтому я также обернул запрос в try/catch с WebException, в моем случае добавив:
ServicePointManager.Expect100Continue = true;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
Перед webRequest сделали свое дело. Также вы должны обернуть ваш WebResponse и потоки в использование операторов, как упомянуто tvanfosson.
Надеюсь, это поможет.