我正试图弄清楚这一点,因为我觉得我错过了什么。每当我有一个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;
}
答案 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)
WebRequest
是一个抽象类,它不会暴露您将要使用的大多数属性/方法。您必须将其强制转换为适当的类型才能使用它。静态方法Create
将根据您的URL返回专用的WebRequest
对象。如您所知,此URL使用HTTP协议(http://
),将其转换为HttpWebRequest
是安全的。但是,它可以是FtpWebRequest
。GetRequestStream
初始化设置在using(...)
语句中。看起来WebRequest
(及其子级)未实现IDisposable
答案 2 :(得分:0)
1。
Webrequest.Create
方法返回WebRequest
引用,但实际对象具有不同的类型,具体取决于您要执行的请求类型。在您的情况下,您正在执行HTTP请求,因此实际对象是HttpWebRequest
对象。您可以将引用转换为对象的实际类型,以访问特定于HttpWebRequest
类的成员。
2。
HttpWebRequest
不是一次性的。对using
对象使用HttpWebResponse
块:
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) {
...
}