.NET 5升级.NET 6后Azure部署wwwroot路径错误求助
将Web应用从.NET 5升级至.NET 6,部署到Azure后出现wwwroot文件夹找不到的问题,异常信息显示的是开发环境的路径。在.NET 5中该路径会被动态处理为当前文件夹,尝试多种方法均无效,求助遗漏了什么以及修复方案。
异常信息
System.IO.DirectoryNotFoundException: C:\vsts\rs_source\Lakemedelshantering\LakemedelshanteringApi\LakemedelshanteringApi\wwwroot
at Microsoft.Extensions.FileProviders.PhysicalFileProvider..ctor(String root, ExclusionFilters filters)
at Microsoft.Extensions.FileProviders.PhysicalFileProvider..ctor(String root)
at Microsoft.AspNetCore.Hosting.StaticWebAssets.StaticWebAssetsLoader.<>c.b__1_0(String contentRoot)
at Microsoft.AspNetCore.StaticWebAssets.ManifestStaticWebAssetFileProvider..ctor(StaticWebAssetManifest manifest, Func`2 fileProviderFactory)
at Microsoft.AspNetCore.Hosting.StaticWebAssets.StaticWebAssetsLoader.UseStaticWebAssetsCore(IWebHostEnvironment environment, Stream manifest)
at Microsoft.AspNetCore.Hosting.StaticWebAssets.StaticWebAssetsLoader.UseStaticWebAssets(IWebHostEnvironment environment, IConfiguration configuration)
at Microsoft.AspNetCore.WebHost.<>c.b__9_0(WebHostBuilderContext ctx, IConfigurationBuilder cb)
at Microsoft.AspNetCore.Hosting.GenericWebHostBuilder.<>c__DisplayClass9_0.b__0(HostBuilderContext context, IConfigurationBuilder builder)
at Microsoft.Extensions.Hosting.HostBuilder.BuildAppConfiguration()
at Microsoft.Extensions.Hosting.HostBuilder.Build()
at LakemedelshanteringApi.Program.Main(String[] args) in C:\vsts\rs_source\Lakemedelshantering\LakemedelshanteringApi\LakemedelshanteringApi\Program.cs:line 17
Program.cs代码
public static void Main(string[] args) { CreateHostBuilder(args).Build().Run(); } public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args).ConfigureWebHostDefaults(webBuilder => { webBuilder.UseContentRoot(Directory.GetCurrentDirectory()); webBuilder.ConfigureAppConfiguration((hostingContext, config) => { config.SetBasePath(Directory.GetCurrentDirectory()); config.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true); config.AddEnvironmentVariables(); config.Build(); }); webBuilder.UseStartup<Startup>(); }); }
这个问题核心是.NET 6对静态Web资产的处理逻辑变化,部署时错误加载了开发环境生成的静态资产清单,导致硬编码的本地路径被带入生产环境。以下是具体修复步骤:
仅在开发环境启用静态Web资产
修改Program.cs,添加环境判断,避免生产环境加载开发模式的静态资产配置:public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseContentRoot(Directory.GetCurrentDirectory()); webBuilder.ConfigureAppConfiguration((hostingContext, config) => { config.SetBasePath(Directory.GetCurrentDirectory()); config.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true); config.AddEnvironmentVariables(); }); // 仅开发环境启用静态Web资产加载 webBuilder.ConfigureServices((context, services) => { if (context.HostingEnvironment.IsDevelopment()) { StaticWebAssetsLoader.UseStaticWebAssets(context.HostingEnvironment, context.Configuration); } }); webBuilder.UseStartup<Startup>(); });清理残留文件并重新发布
删除项目根目录下的obj和bin文件夹,避免残留开发环境的清单文件;使用dotnet publish命令重新生成部署包,确保生产环境静态资产配置正确;重新部署到Azure覆盖原有文件。检查Azure环境配置
确认Azure App Service的应用设置中,ASPNETCORE_ENVIRONMENT值为Production;检查部署包内是否包含wwwroot文件夹,确保静态文件已被正确打包。简化冗余配置
.NET 6的CreateDefaultBuilder已经默认处理了ContentRoot和BasePath的设置,可移除代码中重复的UseContentRoot和SetBasePath调用,减少配置出错概率。
内容的提问来源于stack exchange,提问作者Carl-Johan Uhlin

