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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM