我在ASP.NET中运行了一些遗留代码,其工作原理如下:
void HandleRequest(HttpContext context)
{
try {
if( some condition ) {
try {
doSomething( context.Request.InputStream );
} finally {
context.Request.InputStream.Close();
}
}
// moar code follows which doesn't access InputStream
} finally {
context.Request.InputStream.Close();
}
}
请注意,无论是否访问InputStream
,都会检索并关闭它。我想这是浪费时间,第二个.Close()
是多余的。
我是否必须关闭我的代码从未访问过的HttpRequest输入流?
答案 0 :(得分:2)
由于您未创建InputStream
,因此您不应对其进行关闭。
这样的规则可以让我们保持理智 - 如果 负责关闭它,那么其他对象将由您负责? HttpContext
有很多要检查的属性。如果他们向HttpContext
添加新属性,现有代码会发生什么?
如果他们希望你有责任关闭它,那么它应该是public Stream CreateInputStream()
,而绝对不是财产。
答案 1 :(得分:2)
没有。它将由HttpRuntime处理,HttpRuntime在请求完成后调用HttpContext.Request.Dispose。在这里查看源代码。 http://referencesource.microsoft.com/#System.Web/xsp/system/Web/HttpRuntime.cs#c0635347fb5a9826 http://referencesource.microsoft.com/#System.Web/xsp/system/Web/HttpRequest.cs#118b5aa7679e37f7