C#HttpWebRequest突然挂起程序。没早点

时间:2011-07-23 22:17:18

标签: c# httpwebrequest

早些时候我做了一个非常好的HttpWebRequest,我的StreamReader完全读了网站的HTML。

但是突然之间,在测试了它的功能并确认它工作了很多次后,它在StreamReader系列中挂起了程序。 我试过删除这一行,代码继续。

事情是;我尝试输入一个不同于我需要使用的网站(我放在www.google.com上)并且它工作得非常好。所以我的错误结论是,它只是我需要使用的网站,我无法访问,这让我觉得端部(网站)取消我的连接或阻止我或其他东西。但! HttpWebRequest本身不挂起或任何东西,这必然意味着它成功地建立了对网站的请求?

足够的闲聊,这是代码:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("website here");
MessageBox.Show("1"); //This is shown.
string HTMLLink = (new     StreamReader(request.GetResponse().GetResponseStream())).ReadToEnd(); //This is where the     program hangs....
MessageBox.Show("2"); //This is not shown! Below this isn't being executed.
if (HTMLLink.Length > 0)
{
    HTMLLink = HTMLLink.Substring(HTMLLink.IndexOf("uuu"), HTMLLink.Length -     HTMLLink.IndexOf("uuu"));
    HTMLLink = HTMLLink.Substring(0, HTMLLink.IndexOf("\" TARGET="));
    request = (HttpWebRequest)WebRequest.Create(HTMLLink);
    string HTML = (new     StreamReader(request.GetResponse().GetResponseStream())).ReadToEnd();
    if (HTML.Length > 0 && HTML.Contains(" </script><br><br><br>") && HTML.Contains("    <br><br><script "))
    {
        HTML = HTML.Substring(HTML.IndexOf(" </script><br><br><br>") + 22,     HTML.IndexOf("<br><br><script "));
        HTML = HTML.Substring(0, HTML.IndexOf("<br><br><script "));
        HTML = HTML.Replace("\r\n", "");
        HTML = HTML.Replace("\n", "");
        HTML = HTML.Replace("<br>", "\r\n");
        HTML = HTML.Replace("<BR>", "\r\n");
        HTML = HTML.Replace("<br />", "\r\n");
        HTML = HTML.Replace("<BR />", "\r\n");
        textBox.Text = HTML;
    }
}

请记住,它工作得很好,然后突然间它开始挂起,并且它可以在www.google.com上正常工作。

顺便说一句,是的,我做了很多搜索。没有用的结果。

我已经尝试过超时,它会超时。 也许网站阻止我的程序认为它是蜘蛛?然后怎样呢?

每次当我到达StreamReader时(无论我如何设置它)它都会开始挂起。 并且它一直悬挂,它不会产生任何结果。 这只发生在lyrics007.com这是我需要的确切网站。它适用于谷歌。

请帮助!

提前致谢!

2 个答案:

答案 0 :(得分:1)

WebRequest.GetResponse()是一个阻止通话。它会等到它能够成功连接并在将控制权返回给调用者之前接收响应,或者如果不成功则抛出异常。无法修改此行为。

您通常不希望您的应用程序等待某些事情发生,因此您通常将GetResponse()调用委托给另一个线程,以便您可以继续在当前线程中执行其他工作。

克服此问题的常用方法是异步调用。您将调用BeginGetResponse(),而不是调用GetResponse,传入一个应该在操作完成时执行的函数(例如,包含当前方法的其余部分,以及对EndGetResponse()的调用)。执行控制可以传递回调用者,同时在后台线程中等待响应,由.NET线程池自动处理。

答案 1 :(得分:0)

在致电GetResponse之前,不会发送请求。如果这是悬挂的地方,我倾向于说该网站没有响应。您是否尝试使用Web浏览器连接到该URL并查看它是否有效?