You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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.csCreateWebHostBuilder方法中指定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

火山引擎 最新活动