在以下C#代码中使用关键字USING的正确方法是什么?

时间:2012-08-16 14:53:45

标签: c# httpwebrequest using webrequest

我正试图弄清楚这一点,因为我觉得我错过了什么。每当我有一个using对象时,我想使用关键字IDisposable。请注意代码有效,我只想优化它。

我在这里有两个问题:

1)对于此代码:

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

像这样添加(HttpWebRequest)是什么意思?我将WebRequest转换为HttpWebRequest吗?

为什么我不能这样做?

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

2)在下面的功能代码中,如何在适用的情况下使用关键字using

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

3 个答案:

答案 0 :(得分:3)

问题1:

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

强制转换的原因是,WebRequest上的静态Create方法返回WebRequest的实例,该实例最适合您在网址中提供的方案(即http) ://地址将返回HttpWebRequest,ftp://将返回FtpWebRequest等。如您所知,您的网址为http,您知道您将返回HttpWebRequest,因此您可以显式转换为正确的类型,以便在摘要{{1}上访问额外的功能HttpWebRequest }。

现在,WebRequest不是WebRequest,所以你不能在using语句中使用它!

问题2:在您的功能代码中,唯一可以使用IDisposable语句的地方是using访问权限:

Stream

可以重写:

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

答案 1 :(得分:1)

  1. WebRequest是一个抽象类,它不会暴露您将要使用的大多数属性/方法。您必须将其强制转换为适当的类型才能使用它。静态方法Create将根据您的URL返回专用的WebRequest对象。如您所知,此URL使用HTTP协议(http://),将其转换为HttpWebRequest是安全的。但是,它可以是FtpWebRequest
  2. 您可以将GetRequestStream初始化设置在using(...)语句中。看起来WebRequest(及其子级)未实现IDisposable

答案 2 :(得分:0)

1。 Webrequest.Create方法返回WebRequest引用,但实际对象具有不同的类型,具体取决于您要执行的请求类型。在您的情况下,您正在执行HTTP请求,因此实际对象是HttpWebRequest对象。您可以将引用转换为对象的实际类型,以访问特定于HttpWebRequest类的成员。

2。 HttpWebRequest不是一次性的。对using对象使用HttpWebResponse块:

using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) {
  ...
}