【问题标题】:File upload asp.net core - System.ObjectDisposedException: 'Cannot access a closed file.'文件上传 asp.net 核心 - System.ObjectDisposedException:“无法访问已关闭的文件。”
【发布时间】:2021-08-30 09:58:43
【问题描述】:

我正在使用 asp.net 核心和 C# 编程。

我在控制器中有一个方法可以从视图中的表单上传文件。

public async void UploadFile([FromForm(Name = "aFile")] IformFile aFile)
{
   var filePath = Path.Combine(_webhost.WebRootPath, "Images", aFile.FileName);

   if (aFile.Length > 0)
   {
      using (FileStream fs = System.IO.File.Create(filePath))
      {
         await aFile.CopyToAsync(fs);
      }
   }
}

155kb 上传成功;但是,一个 3.38 MB 的文件失败了:

System.ObjectDisposedException: 'Cannot access a closed file.'

我已了解到该问题可能与限制和流处理有关;但是,尽管添加了我在堆栈溢出方面推荐的修复程序,但问题仍然存在,例如:

[HttpPost, DisableRequestSizeLimit, RequestFormLimits(MultipartBodyLengthLimit = Int32.MaxValue, ValueLengthLimit = Int32.MaxValue, ValueCountLimit = Int32.MaxValue)]

欢迎任何建议 :) 谢谢!

【问题讨论】:

    标签: c# file asp.net-core model-view-controller


    【解决方案1】:

    由于您使用了async void,您陷入了竞争状态。由于void 返回类型,运行您的应用程序的服务器代码无法知道您的方法何时完成并立即处理请求。
    使用Task 作为UploadFile 方法的返回类型。

    在使用async 时,您通常应该避免使用void 返回类型。
    See the article from Microsoft for more infos

    【讨论】:

      【解决方案2】:

      此线程中记录了一个可能的修复方法:https://forums.asp.net/t/1397944.aspx?+Cannot+access+a+closed+file

      具体来说,在您的网络配置中更改“requestLengthDiskThreshold”的值。

      <system.web>
      <httpRuntime executionTimeout="90" maxRequestLength="20000" useFullyQualifiedRedirectUrl="false" requestLengthDiskThreshold="8192"/>
      </system.web>
      

      提到了类似的修复@System.ObjectDisposedException: Cannot access a closed Stream

      【讨论】:

      • 感谢您的建议杰里米。我在我的项目中添加了一个 web.config 文件,并如上所述更改了“requestLengthDiskThreshold”。没有运气:(
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多