IIS ASP.NET 6 启动抛出 System.IO.DirectoryNotFoundException: D:\agent\_work\38\s\IdentityServer\wwwroot\

cmi*_*nus 13 iis asp.net-core .net-6.0

我们正在将我们的一个应用程序(在本例中为 IdentityServer)从 .NET 5 更新到 .NET 6。它由 IIS 托管并由 Azure Devops Services 部署。我们看到的问题是,在我们的开发环境中,网站无法加载,但在我们的临时环境中,它运行得很好。我们在开发中看到的错误是

12:45:37.519|Fatal|1||Host terminated unexpectedly.||
System.IO.DirectoryNotFoundException: D:\agent\_work\38\s\IdentityServer\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.<UseStaticWebAssetsCore>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.<ConfigureWebDefaults>b__9_0(WebHostBuilderContext ctx, IConfigurationBuilder cb)
   at Microsoft.AspNetCore.Hosting.GenericWebHostBuilder.<>c__DisplayClass9_0.<ConfigureAppConfiguration>b__0(HostBuilderContext context, IConfigurationBuilder builder)
   at Microsoft.Extensions.Hosting.HostBuilder.BuildAppConfiguration()
   at Microsoft.Extensions.Hosting.HostBuilder.Build()
   at IdentityServer.Program.Main(String[] args) in D:\agent\_work\38\s\IdentityServer\Program.cs:line 23

Run Code Online (Sandbox Code Playgroud)

它报告的路径D:\agent\_work\38\s\IdentityServer\wwwroot\很有趣,因为该路径与 DevOps 构建机器的路径相同。如果我们恢复到 .NET 5,我们就不会看到此错误,并且我们在临时计算机上也不会看到该问题。

该类Program.cs定义为

12:45:37.519|Fatal|1||Host terminated unexpectedly.||
System.IO.DirectoryNotFoundException: D:\agent\_work\38\s\IdentityServer\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.<UseStaticWebAssetsCore>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.<ConfigureWebDefaults>b__9_0(WebHostBuilderContext ctx, IConfigurationBuilder cb)
   at Microsoft.AspNetCore.Hosting.GenericWebHostBuilder.<>c__DisplayClass9_0.<ConfigureAppConfiguration>b__0(HostBuilderContext context, IConfigurationBuilder builder)
   at Microsoft.Extensions.Hosting.HostBuilder.BuildAppConfiguration()
   at Microsoft.Extensions.Hosting.HostBuilder.Build()
   at IdentityServer.Program.Main(String[] args) in D:\agent\_work\38\s\IdentityServer\Program.cs:line 23

Run Code Online (Sandbox Code Playgroud)

我们确实有其他 .NET 6 Web 应用程序在此 IIS 实例上运行良好。我认为问题可能出在我们的发布管道中,但它们在环境之间的任务配置是相同的。尝试在代码或配置中查找目录路径,但在任何地方都没有看到它。.UseWebRoot("path to folder")已尝试通过.UseContentRoot("path to folder")Program.cs手动设置 WebRoot 和 ContentRoot 路径,但在日志或应用程序启动中没有看到任何更改

即使更新了web.config文件以获得在元素中执行项目 dll 的确切路径aspNetCore,但仍然没有变化。

2022 年 2 月 10 日更新

添加了调试输出到启动以验证文件和文件夹路径。环境变量和执行文件路径中的所有内容看起来都是正确的。

ASPNETCORE_IIS_PHYSICAL_PATH - C:\inetpub\webapps\IdentityServer\
Executable Path: C:\inetpub\webapps\IdentityServer\IdentityServer.dll
Run Code Online (Sandbox Code Playgroud)

cmi*_*nus 27

问题最终是我们如何将更新从 DevOps 推送到服务器。我们的管道是为了将文件复制到构建文件夹的 Release 目录之外而构建的。这种方法的问题之一是站点运行不需要但在构建期间生成的文件也会复制到发布服务器。在这种情况下,.NET 6 中生成的新文件.staticwebassets.runtime.json被复制到我们的服务器。

.NET 6 的行为方式似乎是,如果环境设置为Development,那么它将查找此文件以找出静态 Web 资源的位置。如果该文件不存在,则假定该文件位于站点的 wwwroot 子目录中。这对于从本地 Visual Studio 运行项目的实例是有意义的。有关此文件的更多详细信息可在另一篇SO 帖子中找到,其中包含 GitHub 中源代码的链接。为了解决我们的问题,我们更改了发布管道以使用在解决方案上publish.zip运行命令时生成的文件。publish该存档仅包含运行该站点所需的文件,因此不.staticwebassets.runtime.json包含任何无关文件。我们应该一直这样做……吸取教训。

现在,我们解压缩该publish.zip文件,应用所有文件转换,然后将解压缩的文件复制到 Web 服务器。


BDa*_*ley 5

我最初创建了一个 ASP.NET Core Web 应用程序,但打算使用 API。我删除了wwwroot文件夹和pages文件夹。我尝试运行调试器并遇到此异常。

\n
System.IO.DirectoryNotFoundException: "\\wwwroot\\"\n
Run Code Online (Sandbox Code Playgroud)\n

我在这一行收到错误(默认模板逻辑)

\n
var builder = WebApplication.CreateBuilder(args)\n
Run Code Online (Sandbox Code Playgroud)\n

经过调查,我发现我的项目文件(*.csproj)中没有引用 wwwroot 文件夹,这令人费解,因为我认为这可能是问题的根源。

\n

解决方案:

\n

\xe2\x80\xa2 将 wwwroot 文件夹添加回:我将 wwwroot 文件夹添加回我的项目,这解决了问题。

\n

\xe2\x80\xa2 Clean Build:另外,我发现删除 wwwroot 文件夹并执行“clean build”(通过右键单击解决方案资源管理器中的解决方案并选择“Clean Solution”)也可以解决该问题。

\n

补充笔记:

\n

了解问题:wwwroot 文件夹通常用于在 ASP.NET Core 应用程序中提供静态文件。如果中间件或配置的一部分仍然期望此文件夹存在,则可能会导致异常。即使您切换到 Web API 项目,某些默认配置或依赖项可能仍会查找此目录。

\n

给其他面临类似问题的人的提示:如果您遇到类似问题,请务必检查中间件配置和项目设置。查找对静态文件或 wwwroot 目录的任何引用。另外,请记住,清理构建(通过重建解决方案)可能有助于删除对已删除文件或目录的残留引用。

\n