2014-01-30 1 views
3

У меня есть код, где я посылаю запрос URL и получение ответа и хранящий его в виде строки, какНевозможно прочитать данные из транспортного соединения: существующее соединение было принудительно закрыто удаленным хостом в C#

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? Я включил попытку и поймать, чтобы избежать какой-либо ошибки и продолжить работу без какой-либо остановки. Выбрал интернет для решения, но решения этой конкретной проблемы в значительной степени специфичны. Пожалуйста, любая помощь приветствуется. Спасибо заранее.

+0

Возможно, сервер ожидает другой URL-адрес, возможно, для его запроса требуется специальный специальный заголовок, возможно, он требует аутентификации и т. Д. –

+0

@ L.B Как игнорировать эту проблему и продолжить продвижение по другим URL-адресам? Я уже поставил попытку и поймал. Что еще нужно сделать? – user3188390

+0

Try/catch здесь не поможет. Найдите документы или если у вас есть рабочий код, используйте Fiddler, чтобы узнать, что он отправляет и получает. –

ответ

3

Фактическое исключение, вероятно, является IOException - вам нужно будет поймать этот тип исключения, а также WebException. Фактическая проблема может заключаться в том, что ваш URL устарел, и система больше не работает с веб-сервером, или, возможно, запрос должен быть аутентифицирован/нуждается в заголовке, как предлагает @ L.B.

Кроме того, вы потенциально протекаете всевозможные ресурсы. Вы должны обернуть ваши 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. 
} 
+0

Привет, я столкнулся с той же проблемой, что и мой код Dim payResp As HttpWebResponse = DirectCast (payReq.GetResponse(), HttpWebResponse) Dim sr As New StreamReader (payResp.GetResponseStream()) Dim response As String = sr.ReadToEnd() sr.Close() – Vivekh

3

У меня были проблемы с соединением, которое принудительно закрывается с разными хостами. Кажется, проблема может быть решена путем изменения различных свойств объекта WebRequest.

следующие выводы были изложены в блоге по briancaos: An existing connection was forcibly closed by the remote host

упомянутых в посте выше шаги включают в себя:

Set WebRequest.KeepAlive в False.

WebRequest.ProtocolVersion до HttpVersion.Version10.

Набор WebRequest.ServicePoint.ConnectionLimit для 1

Это действительно работает для меня, но я не проверял на нескольких узлах, как до сих пор. Тем не менее, я серьезно предлагаю прочитать пост, поскольку он идет в путь более подробно.

В случае, если ссылка get сломана, вот архив.org cached version.

Смежные вопросы

 Смежные вопросы