我应该处理 FileUpload.PostedFile.InputStream 吗?
Should I dispose FileUpload.PostedFile.InputStream?
是否需要这段代码,或者因为页面的 UnLoad 事件无论如何都会处理页面上的所有控件,所以编写这样的代码没有意义:
fu.PostedFile.InputStream.Flush();
fu.PostedFile.InputStream.Close();
fu.FileContent.Dispose();
我问是因为在 msdn 的例子中我看到他们写的代码像
FileUpload1.SaveAs(savePath);
但之后再也不用费心处理流了,但在手头上我看到有些人确实在保存后明确处理了输入流?
Official guidance 建议不需要处理这个流,因为它会在请求处理结束时被处理:
Server resources that are allocated to buffer the uploaded file will be destroyed when the request ends. To save a durable copy of the file, use the SaveAs method.
为了支持这一点,我还通过源代码挖掘了一些代码。结果是 FileUpload
和 HttpPostedFile
都不负责处理这个流。实际上它们本身根本不持有任何资源,只是提供一个接口来访问部分请求。
HttpRequest
做了一些处理。但并不是所有的一次性物品都会被处理掉。这是它的 Dispose
:
/*
* Cleanup code
*/
internal void Dispose() {
if (_serverVariables != null)
_serverVariables.Dispose(); // disconnect from request
if (_rawContent != null)
_rawContent.Dispose(); // remove temp file with uploaded content
}
但是没有配置的是上传控制接口的集合HttpRequest.Files
。为了用数据填充这个集合,每个发布的文件都被包装到一个 HttpPostedFile
对象中,并为每个创建一个 HttpInputStream
。这个流对象持有对整个数据的引用(见上面的rawContent
)并且知道相关文件部分的偏移量和长度。值得注意的是 HttpInputStream
实现了 IDisposable
,但是我无法找到处理这些流对象的代码。
总结一下:
- 上传控件不处理流
- Request 或 HttpContext 也不处理流
- 但是请求处理基础数据
所以看起来这里的想法是当请求处理完成时,将删除对相关数据的引用并将其处理掉。所以手动处理你使用过的流不会有什么坏处,但也没有必要。
是否需要这段代码,或者因为页面的 UnLoad 事件无论如何都会处理页面上的所有控件,所以编写这样的代码没有意义:
fu.PostedFile.InputStream.Flush();
fu.PostedFile.InputStream.Close();
fu.FileContent.Dispose();
我问是因为在 msdn 的例子中我看到他们写的代码像
FileUpload1.SaveAs(savePath);
但之后再也不用费心处理流了,但在手头上我看到有些人确实在保存后明确处理了输入流?
Official guidance 建议不需要处理这个流,因为它会在请求处理结束时被处理:
Server resources that are allocated to buffer the uploaded file will be destroyed when the request ends. To save a durable copy of the file, use the SaveAs method.
为了支持这一点,我还通过源代码挖掘了一些代码。结果是 FileUpload
和 HttpPostedFile
都不负责处理这个流。实际上它们本身根本不持有任何资源,只是提供一个接口来访问部分请求。
HttpRequest
做了一些处理。但并不是所有的一次性物品都会被处理掉。这是它的 Dispose
:
/*
* Cleanup code
*/
internal void Dispose() {
if (_serverVariables != null)
_serverVariables.Dispose(); // disconnect from request
if (_rawContent != null)
_rawContent.Dispose(); // remove temp file with uploaded content
}
但是没有配置的是上传控制接口的集合HttpRequest.Files
。为了用数据填充这个集合,每个发布的文件都被包装到一个 HttpPostedFile
对象中,并为每个创建一个 HttpInputStream
。这个流对象持有对整个数据的引用(见上面的rawContent
)并且知道相关文件部分的偏移量和长度。值得注意的是 HttpInputStream
实现了 IDisposable
,但是我无法找到处理这些流对象的代码。
总结一下:
- 上传控件不处理流
- Request 或 HttpContext 也不处理流
- 但是请求处理基础数据
所以看起来这里的想法是当请求处理完成时,将删除对相关数据的引用并将其处理掉。所以手动处理你使用过的流不会有什么坏处,但也没有必要。