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
分类:
.Net Core
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)