Невозможно прочитать данные из транспортного соединения: существующее соединение было принудительно закрыто удаленным хостом в 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.

Надеюсь, это поможет.

Другие вопросы по тегам