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

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 的所有单个缓冲文件从内存移到磁盘的临时文件。

  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值