ASP.NET Core 6.0本地读文件正常 staging环境报目录未找到异常
异常根因
- 你写的
../Application/xxx这类相对路径,解析规则是相对于程序启动时的当前工作目录,和源码文件CheckoutConfirmCommand.cs的存放位置没有任何关系。本地开发时用IDE、dotnet run启动,工作目录恰好是项目源码目录,凑上你写的路径碰巧能命中源码里的html文件,纯属于巧合——哪怕在本地,如果你切到其他目录执行编译好的dll,一样会报找不到文件的错。 - staging环境的程序工作目录和本地完全不同,从报错信息看,staging上程序的工作目录是系统根目录
/,最终拼出来的路径是/Application/Cart/Commands/CheckoutConfirm/HtmlFiles/Start.html,和实际文件位置完全不匹配。 - 你参考本地源码的目录结构写路径,但ASP.NET Core发布后不会保留
src/Application/xxx这类源码层级目录,而且默认情况下你项目里的html文件如果没配置复制规则,根本不会被输出到发布目录里,就算路径写对了也读不到。
修复方案
- 先配置html文件的输出规则:右键项目里的
Start.html打开属性面板,将「复制到输出目录」设置为如果较新则复制,「生成操作」设置为「内容」,保证发布时这个文件会被拷贝到发布输出目录的对应位置。 - 抛弃硬编码的相对路径写法,通过依赖注入获取
IWebHostEnvironment实例,用它提供的ContentRootPath(程序内容根目录,发布后就是发布目录的根路径)拼接绝对路径读取文件,参考代码:
// 构造函数注入IWebHostEnvironment实例 private readonly IWebHostEnvironment _hostEnv; public CheckoutConfirmCommand(IWebHostEnvironment hostEnv) { _hostEnv = hostEnv; } // 读取文件的代码 var fileFullPath = Path.Combine( _hostEnv.ContentRootPath, "Application/Cart/Commands/CheckoutConfirm/HtmlFiles/Start.html" ); var start = File.ReadAllText(fileFullPath);
注意:
Path.Combine会自动处理不同系统的路径分隔符,不要自己手写斜杠拼路径,避免Windows/Linux路径格式不兼容的问题。
内容的提问来源于stack exchange,提问作者hanushi-thana
相关产品推荐
相关产品推荐

