开发者

C# HTTPWebRequest Cannot Be Used to Access a URL Periodically?

I am writing a program to crawl Web pages using C# HT开发者_运维技巧TTWebRequest. Since I need to monitor the updates of a specific URL, I write the code as follows. However, I noticed that I could get responses for two times only. After that, it got no responses. Even though I lengthen the period to one minute, I still got the same problem. I don't understand why. Could you give me a hand? Thanks so much!

GreatFree

while (true)
{
    WebRequest http = HttpWebRequest.Create("http://www.sina.com.cn");
    HttpWebResponse response = (HttpWebResponse)http.GetResponse();
    Console.WriteLine(response.LastModified);
    Thread.Sleep(5000);
}


imaximchuk's answer is correct, but it doesn't explain why.

HTTP connections are pooled - one connection will be reused for a new request if it's available - and returning the connection to the pool occurs when you close or dispose the web response. In your case, you're not closing or disposing the response, so it's not being returned to the pool. There's a maximum number of connections to any particular host, which is configurable but usually shouldn't be changed. The default is two connections - which is why you're seeing two working responses and then a timeout.

I believe there's a finalizer somewhere which will release the connection when it notices the relevant object is eligible for garbage collection, but that's non-deterministic.

Basically: always close a web response, ideal using a using statement.

while (true)
{
    WebRequest http = WebRequest.Create("http://www.sina.com.cn");
    using (HttpWebResponse response = (HttpWebResponse)http.GetResponse())
    {
        Console.WriteLine(response.LastModified);
    }
    Thread.Sleep(5000);
}


You should call response.Close() when you have finishied working with respose or use using(HttpWebResponse response ... to close it automatically

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜