Windows Server 2022 + IIS + ASP.NET Core 完整可上传大文件的 报错的问题

核心异常:

System.UnauthorizedAccessException: Access to the path 'C:\Windows\TEMP\ASPNETCORE_*.tmp' is denied.

C:\inetpub\wwwroot\ePortal\ <- 应用根目录

│ ePortalPlus.exe

│ web.config

└─ logs

stdout_YYYYMMDD_HHMMSS_xxx.log

注意事项

默认 stdoutLogEnabled="false",日志不会生成,需要临时设置为 true。

确保 IIS AppPool 用户有写权限:

右键 logs 文件夹 → 属性 → 安全 → 给应用池用户(如 IIS AppPool\ePortalPlus)写权限。

日志会一直生成,调试完成后建议关闭:

stdoutLogEnabled="false"

🔹 原因分析

ASP.NET Core 上传文件时,默认会在 临时目录 (Path.GetTempPath(),Windows 下通常是 C:\Windows\TEMP) 创建 临时缓存文件。

你当前的 应用池用户(IIS AppPool 用户)没有 写入 C:\Windows\TEMP 的权限,导致创建临时文件失败。

这发生在:

Microsoft.AspNetCore.WebUtilities.FileBufferingReadStream.CreateTempFile()

也就是 ASP.NET Core 在读取上传的 IFormFile 时尝试写临时文件失败。

🔹 解决办法

方案 1:给应用池用户写权限(推荐)

找到 IIS 应用池对应的用户,例如 IIS AppPool\ePortalPlus。

给 C:\Windows\TEMP 文件夹 完全控制或修改权限:

右键 → 属性 → 安全 → 编辑 → 添加 IIS AppPool\ePortalPlus → 允许"修改"和"写入"。

重启 IIS 网站,上传就可以正常创建临时文件。

方案 2:修改 ASP.NET Core 临时目录

可以在 Program.cs 或 Startup.cs 设置 TempDirectory,改用应用目录下的临时文件夹:

var tempPath = Path.Combine(AppContext.BaseDirectory, "Temp");

Directory.CreateDirectory(tempPath);

Environment.SetEnvironmentVariable("TMP", tempPath);

Environment.SetEnvironmentVariable("TEMP", tempPath);

优点:不改系统 C:\Windows\TEMP 权限,更安全。

需要确保应用池用户有该目录写权限。

方案 3:直接读取到内存(小文件可行)

如果文件较小,可以完全用内存,不写临时文件:

using var ms = new MemoryStream();

await fileUpload.CopyToAsync(ms);

var originalBytes = ms.ToArray();

⚠️ 大文件(几十 MB 以上)可能导致内存占用过高。

🔹 总结

你的 500 错误不是数据库或代码逻辑问题,而是 IIS 应用池用户没有写 C:\Windows\TEMP 权限。

✅ 推荐做法:

给应用池用户写权限,或

改用应用目录下临时目录,并确保权限。

相关推荐
码事漫谈41 分钟前
C++ 依赖管理三剑客:vcpkg、Conan、xmake 速查手册
后端
计算机毕设匠心工作室1 小时前
【python大数据毕设实战】青少年抑郁症风险数据分析可视化系统、Hadoop、计算机毕业设计、包括数据爬取、数据分析、数据可视化、机器学习
后端·python
计算机毕设小月哥1 小时前
【Hadoop+Spark+python毕设】智能制造生产效能分析与可视化系统、计算机毕业设计、包括数据爬取、Spark、数据分析、数据可视化、Hadoop
后端·python·mysql
四问四不知1 小时前
Rust语言进阶(结构体)
开发语言·后端·rust
笨鸟要努力2 小时前
Qt C++ windows 设置系统时间
c++·windows·qt
WZTTMoon2 小时前
Spring Boot 启动全解析:4 大关键动作 + 底层逻辑
java·spring boot·后端
q***44152 小时前
SQLMAP的下载安装和使用(Windows)
windows
小二·3 小时前
Spring框架入门:深入理解Spring DI的注入方式
java·后端·spring
毕设源码-钟学长3 小时前
【开题答辩全过程】以 基于springboot和协同过滤算法的线上点餐系统为例,包含答辩的问题和答案
java·spring boot·后端