我在c#中创建HTTP WebRequests以导航网站。我创建请求,获得响应并将其读入StreamReader。然后,我使用相同的请求变量来创建新请求并获得新响应...
以下是我的代码:
HttpWebRequest request;
WebResponse response;
Stream responseStream;
StreamReader reader;
string responseFromServer;
request = (HttpWebRequest)WebRequest.Create("https://www.firstRequest.com");
//set cookies and headers here...
response = request.GetResponse();
responseStream = response.GetResponseStream();
reader = new StreamReader(responseStream);
responseFromServer = reader.ReadToEnd();
//second request using the same variables
request = (HttpWebRequest)WebRequest.Create("https://www.secondRequest.com");
response = request.GetResponse();
responseStream = response.GetResponseStream();
reader = new StreamReader(responseStream);
responseFromServer = reader.ReadToEnd();
我知道我必须关闭响应,流和streamreader才能释放资源。 我是否必须在每个请求之间或在所有内容结束时执行此操作?
答案 0 :(得分:3)
是的,你每次都需要自己清理。只需使用您忽略的IDisposable功能:
所以,相反,你可以
using(response = request.GetResponse())
{
using(responseStream = response.GetResponseStream())
{
using(reader = new StreamReader(responseStream))
{
responseFromServer = reader.ReadToEnd();
}
}
}
或更简洁:
using(response = request.GetResponse())
using(responseStream = response.GetResponseStream())
using(reader = new StreamReader(responseStream))
{
responseFromServer = reader.ReadToEnd();
}
...现在您不必担心拨打Close
。 IDisposable实现为您完成(当using
块结束时)。
答案 1 :(得分:1)
Alltough @spender有一个观点,他说你应该使用using
指令,我不认为他的回答能回答你的问题,或者特别有帮助。
在考虑这样的问题时,请考虑C#的基础知识和实现IDisposable
的对象。执行此操作的类会使用在不再使用类时需要释放的非托管资源。这发生在using
- 块的末尾或调用Dispose
时。
然而,在调用Dispose
之后,不再使用该对象。这是Close
的根本区别。使用Close
响应可以释放资源,同一个对象可以被另一个请求重用。
MSDN for Close
现在让我们考虑如果你简单地覆盖响应变量会发生什么。类是C#中的引用类型,变量现在将引用一个新对象,旧的响应对象将在必杀技中消失,等待最终由GC收集而不调用Dispose
。当然不是你想要的。
因此,如果您想重用变量,请务必使用Close