核心异常:
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 权限。
✅ 推荐做法:
给应用池用户写权限,或
改用应用目录下临时目录,并确保权限。