C# WebRequest bug?

C# WebRequest bug?,c#,http,httpwebrequest,c#-2.0,C#,Http,Httpwebrequest,C# 2.0,编辑:已解决,问题是服务器端的 我正在使用C#和.NET2,我想知道这是一个WebRequest bug。。我用这个方法做了几个很好的请求,一切都很好,但在那之后,每次我得到“操作超时了”。我真的不明白为什么会这样 public string RequestPage(string url) { HttpWebRequest req = null; string line = ""; string site = ""; try {

编辑:已解决,问题是服务器端的

我正在使用C#和.NET2,我想知道这是一个WebRequest bug。。我用这个方法做了几个很好的请求,一切都很好,但在那之后,每次我得到“操作超时了”。我真的不明白为什么会这样

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;
    }

您没有处理响应:

using (WebResponse response = req.GetResponse())
using (StreamReader reader = new StreamReader(response.GetResponseStream())
{
    while ((line = reader.ReadLine()) != null) {
        site += line;
    }
}
基本上,每个与您交谈的服务器都有池连接。因为您没有关闭响应,所以它们已经用完了。以上这些应该可以解决问题

此外:

  • 这可能是建立字符串的一种非常缓慢的方法。使用
    StringBuilder
    在循环中连接文本内容
  • 是否确实要删除所有换行符?如果没有,只需使用
    reader.ReadToEnd()

我不知道这是否解决了您的问题,但在完成以下操作时,您应该始终处理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的所有功能,您可以使用:


不,这不是
HttpWebRequest
中的错误。如果尝试将url粘贴到浏览器中会发生什么情况?这是一个youtube页面,因此工作正常。是的,但可能需要为此发送一些HTTP头,就像
用户代理
接受
。您是否验证了浏览器发送的HTTP头?有些网站会阻止不识别自己身份的机器人。YouTube可能会因为认为你是机器人而限制你的请求。您是否经常发出请求?HttpWebRequest也可能阻塞了资源,因为您没有处理它。@blez,@Jon显示的代码非常好,所以请在其他网站上试用。如果它起作用,那么youtube会限制你的请求。@Darin Dimitrov是的,它对其他网站起作用。所以应该是youtube。我该怎么办?发送IE/Firefox标题或?@blez,是的,尝试发送Firefox标题。如果这不起作用,你就不走运了。也许可以寻找一些youtube公开的API。我不知道,从来没有使用过它。我只是使用了Firefox头,问题仍然存在。但是重启应用程序后,一切正常。所以问题应该出在我这边?@blez,你能发布你正在测试的url吗?使用你的第二种方法它会挂起。也许是youtube机器人保护?
public string RequestPage(string url)
{
    using (WebClient client = new WebClient())
    {
        return client.DownloadString(url);
    }
}