版本情況
- 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 的所有單個緩沖文件從內存移到磁盤的臨時文件。