ASP.NET Core 托管在 IIS 上传文件报 500 错误

版本情况

  • Windows Server 2016
  • dotnet-hosting-6.0.2-win
  • IIS 10.0

症状

  • 本地测试正常
  • 上传 ~<50kb 的文件正常
  • 上传 ~>60kb 的文件报异常 500 (Internal Server Error),且异常未被捕捉到

爬坑

由于没有被控制器捕捉到异常,所以我最开始考虑是IIS层面的问题。

查看IIS日志

发现并没有异常信息

打开stdoutLog(关键)

找到了异常信息:

fail: Microsoft.AspNetCore.Server.IIS.Core.IISHttpServer[2]
      Connection ID "17726168139235852346", Request ID "8000003d-0001-f600-b63f-84710c7967bb": An unhandled exception was thrown by the application.
      System.UnauthorizedAccessException: Access to the path 'C:\Windows\TEMP\ASPNETCORE_9df0985f-8e73-4710-a2c6-8c15c60b0835.tmp' is denied.
         ···

真相大白

是在尝试将文件做磁盘缓存的时候,因为对文件夹的权限问题抛出了System.UnauthorizedAccessException

解决

给IIS用户c:\windows\temp的读写权限即可。

原因

为什么~50kb的文件可以,多一点就不行了呢?在文件上传的说明文档中找到了原因:

https://docs.microsoft.com/en-us/aspnet/core/mvc/models/file-uploads?view=aspnetcore-6.0#file-upload-scenarios
整个文件读入 IFormFile,它是文件的 C# 表示形式,用于处理或保存文件。
文件上传所用的资源(磁盘、内存)取决于并发文件上传的数量和大小。 如果应用尝试缓冲过多上传,站点就会在内存或磁盘空间不足时崩溃。 如果文件上传的大小或频率会消耗应用资源,请使用流式传输。
会将大于 64 KB 的所有单个缓冲文件从内存移到磁盘的临时文件。

posted @ 2022-02-21 13:59  陈昱行  阅读(1940)  评论(1编辑  收藏  举报