我应该处理 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.

为了支持这一点,我还通过源代码挖掘了一些代码。结果是 FileUploadHttpPostedFile 都不负责处理这个流。实际上它们本身根本不持有任何资源,只是提供一个接口来访问部分请求。

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,但是我无法找到处理这些流对象的代码。

总结一下:

  1. 上传控件不处理流
  2. Request 或 HttpContext 也不处理流
  3. 但是请求处理基础数据

所以看起来这里的想法是当请求处理完成时,将删除对相关数据的引用并将其处理掉。所以手动处理你使用过的流不会有什么坏处,但也没有必要。