上传文件时的C#内存分配

时间:2013-02-18 08:55:21

标签: c# asp.net-mvc asp.net-mvc-3

有些问题与在MVC中上传文件有关。

上传文件时如何分配内存?

[HttpPost]
    public ActionResult FileUpload(string qqfile)
    {
            var stream = Request.InputStream;

假设有人正在上传一个100 MB的文件,一旦Request.InputStream收到它会发生什么?

编辑:

当处理退出Request.InputStream时,流和ActionResult会发生什么?

  • 流存储在哪里?内存分配?
  • 何时处理?什么时候处理Request.InputStream?
  • 如果我将流存储在保存到的变量中?
  • " stream"会发生什么?变量一旦动作结果退出?
  • 变量是什么" stream" hold?,一个引用/指针 Request.InputStream?或者#34;完整"字节副本(假设为100MB)?

1 个答案:

答案 0 :(得分:5)

Stream旨在允许从数据源读取,而尚未收到所有数据。 Request.InputStream就属于这种情况。其他人,如MemoryStream,直接包装内存缓冲区。

确切存储数据的位置取决于流的类型。 Socket级别上有一个缓冲区,可以保留数据直到读取,或者IIS可以为您缓冲数据。

当您(或.NET,在本例中)处理Stream或垃圾收集器为您执行此操作时,缓冲区将被丢弃。套接字层当然只有在连接关闭后才释放缓冲区 - 配置流并不总是处理底层缓冲区。

这些流的设计使您可以使用Stream数据 - 而不必担心底层缓冲区。谁负责处理流的一般规则是:你创建它?你处理它。

响应您的编辑:如果您将流存储在变量中,例如在ASP.NET会话中,那么一旦不再需要Request对象,.NET将会处理该流。您的变量仍将包含对该流的引用,但从中读取将引发ObjectDisposedException

注意Stream和缓冲区之间的区别 - Stream提供对任何类型缓冲区的读取和/或写入访问权限 - 即使是包含“未包含”数据的虚拟缓冲区还没收到。尝试从该缓冲区读取将阻止当前线程,直到(某些)数据被接收(或直到发生错误)。

并且,为了完成混淆,您可以拥有一个从多个缓冲区读取的流,从同一缓冲区读取多个流,以及流包装流。