Sha*_*eKm 4 c# asp.net-mvc asp.net-mvc-3
问题与在MVC中上传文件有些相关.
上传文件时如何分配内存?
[HttpPost]
public ActionResult FileUpload(string qqfile)
{
var stream = Request.InputStream;
Run Code Online (Sandbox Code Playgroud)
假设有人正在上传一个100 MB的文件,一旦Request.InputStream收到它会发生什么?
编辑:
流Request.InputStream处理和处理退出时会发生什么ActionResult?
Stream还设计为允许从数据源读取,而尚未收到所有数据.情况就是如此Request.InputStream.其他人,比如MemoryStream,直接包装内存缓冲区.
存储数据的确切位置取决于流的类型.Socket级别上有一个缓冲区,可以保留数据直到读取,或者IIS可以为您缓冲数据.
当您(或.NET,在这种情况下)处理Stream或垃圾收集器为您执行此操作时,缓冲区将被丢弃.套接字层当然只有在连接关闭后才释放其缓冲区 - 配置流并不总是处理底层缓冲区.
这些流的设计使您可以使用 - Stream数据 - 而无需担心底层缓冲区.谁负责处理流的一般规则是:你创建它?你处理它.
响应您的编辑:如果您将流存储在变量中,例如在ASP.NET会话中,一旦Request不再需要该对象,.NET将始终处理该流.您的变量仍将包含对该流的引用,但从中读取将引发该流ObjectDisposedException.
注意a Stream和缓冲区之间的区别- a Stream提供对任何类型缓冲区的读取和/或写入访问 - 甚至是包含尚未接收的数据的虚拟缓冲区.尝试从该缓冲区读取将阻止当前线程,直到(某些)数据被接收(或直到发生错误).
并且,为了完成混淆,您可以拥有一个从多个缓冲区读取的流,从同一缓冲区读取的多个流以及流包装流.