Search code examples
c#httpwebrequestusingwebrequest

What would be the correct way to use the keyword USING in the following C# code?


I'm trying to get this correct as I feel I'm missing something. I want to use the keyword using whenever I have an IDisposable object. Please note that the code works, I just want to optimize it.

I have two questions here:

1) For this code:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);

What does it mean to add (HttpWebRequest) like that? Am I converting WebRequest to HttpWebRequest?

Why can't I do this?

HttpWebRequest rq = new HttpWebRequest();
rq.Create(url);

2) In the functional code below, how would I go about using the keyword using where applicable?

public static int UploadFileToixLibrary(string url, string file)
{
    NetworkCredential credentials = new NetworkCredential();
    credentials.UserName = AppVars.Username;
    credentials.Password = AppVars.Password;

    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); 

    request.Credentials = credentials;
    request.Method = "POST";
    request.ContentType = "image/tiff";
    request.Headers.Add("X-Object-Key", Path.GetFileName(file));

    byte[] bytes = File.ReadAllBytes(file);
    Stream st = null;

    try
    { 
        request.ContentLength = bytes.Length;   
        st = request.GetRequestStream();
        st.Write(bytes, 0, bytes.Length);         
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
        return 1;
    }
    finally
    {
        if (st != null)
        {
            st.Close();
        }
    }

    try
    {
        HttpWebResponse response = (HttpWebResponse)request.GetResponse();

        StreamReader sr = new StreamReader(response.GetResponseStream());
        response.Close();
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
        return 1;
    }

    return 0;
}

Solution

  • Question 1:

    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
    

    The reason for the cast, is that the static Create method on WebRequest returns an instance of WebRequest which is most appropriate for the scheme you supply in the url (ie, http:// address will return an HttpWebRequest, ftp:// will return FtpWebRequest etc). As you know your url is http, you know you'll get back an HttpWebRequest, so you can explicitly cast to the right type to get access to the extra functionality HttpWebRequest over the abstract WebRequest.

    Now, WebRequest is not IDisposable, so you cannot use it inside a using statement!

    Question 2: In your functional code, the only place you could use a using statement is around the Stream access:

    try
    { 
        request.ContentLength = bytes.Length;   
        st = request.GetRequestStream();
        st.Write(bytes, 0, bytes.Length);         
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
        return 1;
    }
    finally
    {
        if (st != null)
        {
            st.Close();
        }
    }
    

    Could be re-written:

    request.ContentLength = bytes.Length;   
    using(var st = request.GetRequestStream())
    {
        st.Write(bytes, 0, bytes.Length);         
        st.Close();
    }