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 的所有单个缓冲文件从内存移到磁盘的临时文件。
站外博客地址:https://blog.yuhang.ch