Ошибка WebRequest? - PullRequest
       7

Ошибка WebRequest?

2 голосов
/ 20 августа 2010

РЕДАКТИРОВАТЬ: Решено, проблема была на стороне сервера.

Я использую C # и .NET2, и мне интересно, что ошибка WebRequest .. Я делаю несколько хороших запросов с помощью этого метода, и все в порядке, но после этого каждый раз, когда я получаю «Время операции истекло». Я действительно не понимаю, почему это так.

public string RequestPage(string url) {
        HttpWebRequest req = null;
        string line = "";
        string site = "";

        try {
            req = (HttpWebRequest) WebRequest.Create(url.Trim());
            req.Timeout = 10000;

            StreamReader reader = new StreamReader(req.GetResponse().GetResponseStream());
            while ((line = reader.ReadLine()) != null) {
                site += line;
            }

            return site;
        } catch (Exception ex) {
            MessageBox.Show("ERROR " + ex.Message);
        }

        return null;
    }

Ответы [ 2 ]

2 голосов
/ 20 августа 2010

Я не знаю, решает ли это вашу проблему, но вы всегда должны располагать HttpWebResponse (и другими объектами, реализующими IDisposable), когда вы закончите:

public string RequestPage(string url)
{
    HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
    req.Timeout = 10000;

    using (WebResponse resp = req.GetResponse())
    using (StreamReader reader = new StreamReader(resp.GetResponseStream()))
    {
        return reader.ReadToEnd();
    }
}

Если вам на самом деле не требуются все функции HttpWebRequest, вы можете использовать WebClient вместо:

public string RequestPage(string url)
{
    using (WebClient client = new WebClient())
    {
        return client.DownloadString(url);
    }
}
2 голосов
/ 20 августа 2010

Вы не избавляетесь от ответа:

using (WebResponse response = req.GetResponse())
using (StreamReader reader = new StreamReader(response.GetResponseStream())
{
    while ((line = reader.ReadLine()) != null) {
        site += line;
    }
}

По сути, на каждом сервере, с которым вы разговариваете, есть пулы соединений.Вы исчерпываете их, потому что не закрываете ответ.Вышеприведенное должно разобраться.

Дополнительно:

  • Это потенциально очень медленный способ построения строки.Используйте StringBuilder для объединения текстового содержимого в цикле.
  • Вы действительно хотите удалить все разрывы строк?Если нет, просто используйте reader.ReadToEnd().
...