You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET7.0升级后ASP.NET站点文件占用IOException问题求助

文件被占用IOException问题原因分析

问题场景

升级ASP.NET站点至.NET7.0后,通过HttpClient下载PDF到C:\Temp临时目录,尝试将该PDF添加为邮件附件时触发错误:
IOException: The process cannot access the file because it is being used by another process

相关代码:

// upload invoice to computer
var httpClient = new HttpClient();
var responseStream = await httpClient.GetStreamAsync("..site.com/.../uploads/" + invoice.PfadRel + "");
using var fileStream = new FileStream(@"C:\Temp\Invoice-" + invoice.no + ".pdf", FileMode.Create, (FileAccess)FileShare.ReadWrite);
responseStream.CopyTo(fileStream);

// attach invoice to mail
builder.Attachments.Add(@"C:\Temp\Invoice-" + invoice.no + ".pdf");

核心原因

  • 文件流未及时释放:虽然使用using var声明了fileStream,但responseStream.CopyTo(fileStream)是同步方法,在.NET7的异步上下文优化逻辑下,fileStream的资源释放(文件句柄回收)可能滞后于后续的附件添加操作。此时文件仍被当前进程的fileStream持有,导致builder.Attachments.Add读取文件时触发占用冲突。
  • FileShare参数误解:设置FileShare.ReadWrite仅允许其他进程对文件进行读写操作,但无法解决当前进程内的文件句柄占用问题,因此这个参数对进程内的资源冲突无效。

补充解决建议

要彻底解决问题,需确保文件流操作完成并释放后再访问文件:

  1. 将同步的CopyTo替换为异步方法CopyToAsync,确保流操作完全完成,同时让using var自动及时释放fileStream的资源:
var httpClient = new HttpClient();
var responseStream = await httpClient.GetStreamAsync("..site.com/.../uploads/" + invoice.PfadRel);
using var fileStream = new FileStream(@"C:\Temp\Invoice-" + invoice.no + ".pdf", FileMode.Create, FileAccess.Write, FileShare.Read);
await responseStream.CopyToAsync(fileStream);

builder.Attachments.Add(@"C:\Temp\Invoice-" + invoice.no + ".pdf");
  1. 若需保持同步操作,可在添加附件前手动调用fileStream.Dispose()强制释放资源(不推荐,违背using的设计初衷)。

内容的提问来源于stack exchange,提问作者Paul_412

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 10:02:38