C#项目appsettings.json配置静态文件路径返回NotFound问题求助
1. 配置绑定大小写不匹配问题
你appsettings.json里的路径键名是Realpath(首字母p小写),但模型类VirtualPathConfig的属性是RealPath(首字母P大写),.NET Core默认的配置绑定是区分大小写的,这会直接导致读取到的RealPath属性为null,物理路径自然无法正常生效。
修复方案:把appsettings.json里的
Realpath修改为RealPath,或者给模型类的RealPath属性加上[JsonPropertyName("Realpath")]特性适配小写键名。
2. 相对路径解析错误问题
直接传入相对路径给PhysicalFileProvider时,路径是基于应用程序的工作目录解析的,不同启动场景(dotnet run启动、IIS部署、发布后直接运行)的工作目录可能不一致,相对路径很容易解析到错误位置。
修复方案:注入
IWebHostEnvironment,用内容根路径拼接成绝对路径:
// 先在Startup构造函数注入IWebHostEnvironment private readonly IWebHostEnvironment _env; public Startup(IConfiguration configuration, IWebHostEnvironment env) { Configuration = configuration; _env = env; } // 配置静态文件时拼接绝对路径 var vitualPath = Configuration.GetSection(nameof(VirtualPathConfig)).Get<List<VirtualPathConfig>>(); vitualPath.ForEach(f => { // 拼接得到物理路径的绝对地址 var phyPath = Path.Combine(_env.ContentRootPath, f.RealPath); app.UseStaticFiles(new StaticFileOptions() { FileProvider = new PhysicalFileProvider(phyPath), RequestPath = f.RequestPath }); });
3. 检查配置文件属性
确认appsettings.json文件的【复制到输出目录】属性设置为如果较新则复制,否则发布或运行时配置文件不会被拷贝到运行目录,自然读不到对应配置。
4. 中间件顺序检查
确认UseStaticFiles的注册顺序在UseRouting之后、UseAuthorization/UseEndpoints之前,顺序错误会导致静态文件请求被后续中间件拦截返回404。
5. 文件夹层级校验
你配置的相对路径是../api_website_data/images,需要确认应用运行的工作目录和api_website_data文件夹的层级是否匹配:如果你的API项目根目录和api_website_data是同级目录,那工作目录为API项目根目录时,../会退到两个文件夹的上级目录,找不到对应路径,此时需要调整相对路径为./api_website_data/images或者直接使用绝对路径。
内容的提问来源于stack exchange,提问作者John

