这里有一个关于 here 的所有权的相当大的IDisposable
讨论。
普遍的共识是你不应该处理IDisposable
你没有创建的。
显然,如果您选择将IFormFile
的流内容复制到另一个流,那么您当然有责任处理新的Stream
(例如 MemoryStream),因为您创建了它。
因此,假设您的控制器接受以下对象进行模型绑定:
public class MyRequestObject
{
public IFormFile ChosenFile { get; set; }
}
下面using
确保新MemoryStream
的被处理,但不是来自的原始流IFormFile
:
public async Task<IActionResult> Index(MyRequestObject requestModel)
{
using (var myMemoryStream = new MemoryStream)
{
requestModel.ChosenFile.CopyToAsync(myMemoryStream);
// Use new memory stream (myMemoryStream) here...
}
}
或者,如果你在知道你已经完成它之后调用Dispose()
该方法返回的那个Stream
,那么它不会导致问题。如果需要,您可以将其包装在 using 语句中......IFormFile
OpenReadStream()
这是由另一个IDisposable.Dispose()最佳实践支持的,即:
如果多次调用对象的 Dispose 方法,则对象必须忽略第一次调用之后的所有调用。如果多次调用其 Dispose 方法,则该对象不得引发异常。
因此,如果您愿意,可以在控制器操作中安全地执行此操作:
public async Task<IActionResult> Index(MyRequestObject requestModel)
{
using (var fileStream = requestModel.ChosenFile.OpenReadStream())
{
// Make use of fileStream...
} // using calls Dispose()
}
然而Stream
,返回的实现是类型ReferenceReadStream
who's 的Dispose
方法不做任何事情,即它本质上没有实现,它实际上并没有处理 . 中的底层Stream
,IFormFile
尽管这可能会改变。
在任何情况下,您当然不需要IDisposable
自己实现。