ASP.NET控制器无法发送文件:抛出FileNotFoundException但文件实际存在
ASP.NET控制器读取wwwroot文件时FileNotFoundException的解决办法
问题情况
文件实际存在于wwwroot/Files/text.txt,但控制器执行下载逻辑时抛出FileNotFoundException异常,相关代码如下:
public IActionResult DownloadFile() { var currentDirectory = Directory.GetCurrentDirectory(); var filePath = Path.Combine(currentDirectory, "wwwroot", "Files", "test.txt"); if (System.IO.File.Exists(filePath)) { return File(filePath, "text/plain", "test.txt"); // 以响应形式发送纯文本文件。 } else { return NotFound(); // 文件未找到,返回404响应。 } }
排查方向与解决方法
1. 修正文件名拼写错误
代码中拼接的文件名是test.txt,但实际文件是text.txt,这是最直接的问题。把代码里的文件名改成和实际一致:
var filePath = Path.Combine(currentDirectory, "wwwroot", "Files", "text.txt");
2. 改用WebRootPath获取wwwroot路径(推荐)
Directory.GetCurrentDirectory()在ASP.NET Core中不可靠,不同运行场景(调试、发布、容器部署)下返回的路径可能和预期不符。正确的做法是通过IWebHostEnvironment获取wwwroot的绝对路径:
首先在控制器注入IWebHostEnvironment:
private readonly IWebHostEnvironment _webHostEnv; public YourController(IWebHostEnvironment webHostEnv) { _webHostEnv = webHostEnv; }
然后修改下载方法:
public IActionResult DownloadFile() { var filePath = Path.Combine(_webHostEnv.WebRootPath, "Files", "text.txt"); if (System.IO.File.Exists(filePath)) { return File(filePath, "text/plain", "text.txt"); } else { return NotFound(); } }
3. 确保文件被复制到输出目录
右键项目中的wwwroot/Files/text.txt文件,打开属性面板:
- 将「复制到输出目录」设置为「如果较新则复制」或「始终复制」,这样编译或发布时文件会被同步到目标路径。
4. 检查路径大小写(跨平台部署时)
如果部署在Linux/macOS环境,文件系统区分大小写,必须保证代码中的路径(比如Files、text.txt)和实际文件的大小写完全一致。
内容的提问来源于stack exchange,提问作者JavaGeek
相关产品推荐
相关产品推荐

