Потоковый читатель C#: Соединение было неожиданно закрыто

#c# #.net #visual-studio #winforms #web-crawler

Вопрос:

Поскольку это очень распространенная проблема, но нет надлежащего решения, которое могло бы решить мою проблему.

Я испытываю эту проблему при попытке чтения / загрузки данных из StreamReader

Вот мой код.

 public bool WebSiteIsAvailable(HttpWebRequest request, HttpWebResponse response)
{
    request.Timeout = 15000;
    request.Method = "HEAD"; // As per Lasse's comment

    try
    {
        using (response = (HttpWebResponse)request.GetResponse())
        {
            return true;
        }
    }
    catch (WebException)
    {
        return false;
    }
}

public string ParseHtml(string html)
{
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(html);
    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
    StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding(1251));

    if (WebSiteIsAvailable(request, response))
    {
        richTextBox1.Text = sr.ReadToEnd();

        sr.Close();
        response.Close(); // While using WebResponse please make sure that you close the response stream ie(.close) else it would hang the machine after certain repeated execution.Eg
    }
    else
    {
        response.Close();
    }

    return html;
}
 

Комментарии:

1.вы поддерживаете код или пишете новый код? Если новый код, пожалуйста, рассмотрите возможность его использования System.Net.Http здесь. Вы также звоните GetResponse два раза подряд, это желаемое поведение?

Ответ №1:

Я думаю, вам следует рассмотреть возможность удаления функции WebSiteIsAvailable() и объединения этой логики с вашей функцией ParseHTML. Вы дважды вызываете GetResponse (), и это может быть источником вашей проблемы.

Кроме того, поток кажется немного странным. Вы вызываете GetResponse() и создаете экземпляр средства чтения потока, а ЗАТЕМ вызываете WebSiteIsAvailable. Если WebSiteIsAvailable вернет false, у вас уже есть проблема еще до того, как вы сделаете этот звонок.