1

我正试图纠正这一点,因为我觉得我错过了一些东西。using每当我有一个IDisposable对象时,我都想使用关键字。请注意代码有效,我只是想优化它。

我在这里有两个问题:

1)对于此代码:

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

像这样添加是什么意思(HttpWebRequest)?我要转换WebRequestHttpWebRequest?

为什么我不能这样做?

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

3 回答 3

3

问题一:

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

强制转换的原因是,静态Create方法 onWebRequest返回一个最适合您在 url 中提供的方案的实例WebRequest(即, http:// 地址将返回一个HttpWebRequest, ftp:// 将返回FtpWebRequest等)。你知道你的 url 是 http,你知道你会得到一个HttpWebRequest,所以你可以显式地转换为正确的类型来访问HttpWebRequestabstract上的额外功能WebRequest

现在,WebRequestis not IDisposable,所以你不能在 using 语句中使用它!

问题 2:在您的功能代码中,您可以使用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();
    }
}

可以重写:

request.ContentLength = bytes.Length;   
using(var st = request.GetRequestStream())
{
    st.Write(bytes, 0, bytes.Length);         
    st.Close();
}
于 2012-08-16T15:00:15.147 回答
1
  1. WebRequest是一个抽象类,它不会公开您将要使用的大多数属性/方法。您必须将其转换为适当的类型才能使用它。静态方法将根据您的 URLCreate返回专门的对象。WebRequest如您所知,此 URL 使用 HTTP 协议 ( http://),可以安全地将其转换为HttpWebRequest. 但是,它可能是一个FtpWebRequest.
  2. 您可以将GetRequestStream初始化放在using(...)语句中。看起来WebRequest(及其孩子)没有实现IDisposable
于 2012-08-16T15:00:02.497 回答
0

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

2.HttpWebRequest不是一次性的。为对象使用usingHttpWebResponse

using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) {
  ...
}
于 2012-08-16T15:06:11.463 回答