ASP.NET Core 3.1如何获取执行时正确的WebRootPath路径?
解决ASP.NET Core 3.1中
IWebHostEnvironment.WebRootPath返回源码目录而非运行时目录的问题 这个问题其实是ASP.NET Core开发环境下的默认行为导致的——为了方便开发时修改静态文件后能立即看到效果(不用重新编译复制文件),框架默认会把源码目录下的wwwroot作为Web根目录。但如果你的场景确实需要获取**运行时输出目录(bin/Debug下)**的wwwroot路径,可以试试下面几种方法:
方法1:手动计算运行时wwwroot路径
如果你只是需要获取这个路径来处理文件(比如推送外部文件到该目录),不需要改变框架默认的静态文件根目录,直接通过ContentRootPath拼接即可:
// 在Startup类中使用 var runtimeWebRootPath = Path.Combine(_env.ContentRootPath, "wwwroot");
_env.ContentRootPath在调试时指向的就是你的项目输出目录(比如<源码路径>/bin/Debug/netcoreapp3.1),拼接后就是你要的运行时wwwroot路径。
方法2:修改WebHost的Web根目录配置
如果你希望框架的静态文件服务也使用运行时目录下的wwwroot,可以在Program.cs的CreateWebHostBuilder方法中指定UseWebRoot:
public static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(args) // 指定运行时目录下的wwwroot作为Web根目录 .UseWebRoot(Path.Combine(Directory.GetCurrentDirectory(), "wwwroot")) .UseStartup<Startup>();
这样配置后,_env.WebRootPath就会返回运行时目录下的wwwroot路径了。
关键前提:确保文件复制到输出目录
不管用哪种方法,都要确保wwwroot目录(或里面的文件)被复制到输出目录:
- 右键项目中的
wwwroot文件夹(或内部文件)→ 选择「属性」 - 在「复制到输出目录」下拉框中选择「如果较新则复制」或「始终复制」
这样编译时,wwwroot目录和文件才会被同步到bin/Debug/netcoreapp3.1目录下。
补充一句:开发环境下默认用源码目录的wwwroot是为了支持静态文件热重载,修改Web根目录后就没法享受这个便利了,所以根据你的实际场景选合适的方法就好~
内容的提问来源于stack exchange,提问作者BlackSpy




