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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 11:24:12