views:

379

answers:

4
WebResponse response;
try
{                
 HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
 request.Timeout = 20000;
 response = request.GetResponse();

 request = (HttpWebRequest)WebRequest.Create(url2);
 response = request.GetResponse();
}
catch(Exception ex)
{
 //do something
}              
finally
{
}

where should response.Close() be called?

  • after every GetResponse() in try?

  • after last GetResponse() in try - once?

  • in finally block?
+2  A: 

Put it in the finally block. As per MSDN:

The finally block is useful for cleaning up any resources allocated in the try block as well as running any code that must execute even if there is an exception. Control is always passed to the finally block regardless of how the try block exits.

marco0009
+1  A: 

I would suggest the below

        try
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://www.google.com");
            request.Timeout = 20000;
            using (var response = request.GetResponse())
            {
                //Do something with response.
            }


            request = (HttpWebRequest)WebRequest.Create("http://www.bing.com");
            using (var response = request.GetResponse())
            {
                //Do somehing with response
            }
        }
        catch (Exception ex)
        {
            //do something
        }
        finally
        {
        }
Ramesh
Surely you need to dispose/Close the first "request" instance, since you just overwrite that instance with a new one, you're at the mercy of the Garbage collector to when that first one gets disposed.
Marineio
WebRequest does not implement IDisposable.
John Saunders
+6  A: 

None of the above. You should be using a using block:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Timeout = 20000;
using (WebResponse response = request.GetResponse())
{
    using (var stream = response.GetResponseStream())
    {
        using (var reader = new StreamReader(stream))
        {
            var result = reader.ReadToEnd();
            // Do something with result
        }
    }
}

A using block will ensure that the Dispose method is called, whether or not there is an exception. Dispose will do the same thing as Close.

John Saunders
For a more detailed explanation, you could show how all those using statements get converted to try/finally statements :) Only reason I say this is because he asked if he should put it in a finally statement, which you are in a sense doing... Obviously in a cleaner / easier to read manner.
Allen
A: 

Note that nested using blocks don't need curly braces, improving readability. So John Saunder's code could be written:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Timeout = 20000;
using (WebResponse response = request.GetResponse())
using (var stream = response.GetResponseStream())
using (var reader = new StreamReader(stream))
{
    var result = reader.ReadToEnd();
    // Do something with result
}

VS.NET understands that such nested blocks don't need indenting. Note btw that if you know the encoding of the response or are going to ignore it anyhow, WebClient provides a simpler API - missing header information, so Header-based (transfer/text) encoding detection becomes impossible, but otherwise it works fine.

Eamon Nerbonne
I would argue that this reduces readability. I almost always add braces, even on single-line if statements, except for rare cases like "if (simple-condition) return;"
John Saunders
For short bits of code maybe - for real files adding these unnecessary braces on redundant lines means that your code becomes much longer and less fits on one screen, meaning you'll have less overview. The real hint anyhow should be indentation, and VS.NET automatically indents such code in a non-confusing fashion.
Eamon Nerbonne