为什么 ASP.NET 从命令行启动时,核心 Web 应用程序不提供静态 Web 资产?

Why ASP.NET Core web application does not serve static web assets when started from command line?

这个标题会太长,但这是一个更孤立的问题:

为什么 ASP.NET 核心 Web 应用程序在从命令行启动时不提供静态 Web 资产并且 ASPNETCORE_ENVIRONMENT 未设置,或设置为 [= 以外的任何其他值13=]?

上下文

我使用 VS 2022 内置模板创建了一个新的 ASP.NET 核心 Web 应用程序(.NET 6,但我认为 issue/question 不是 .NET 5 特定的)我没有以任何方式更改创建的应用程序

我能够 运行 我的 ASP.NET IIS Express 下的核心 Web 应用程序,或者 没有 IIS Express 使用 Visual Studio,基于launchsettings.json.,我的意思是使用绿色三角形下拉菜单,并选择 WebApplication 而不是 IIS Express


出于好奇,我尝试从 bin 文件夹启动 WebApplication1.exe。它开始了,我可以使用 https://localhost:5001/ 通过浏览器访问它,页面加载,但没有 CSS,JS。我可以看到所有对静态资源的请求都有404响应。

我怀疑我应该以某种方式配置静态 Web 资源所在的应用程序。我看到相应的 WebApplication1.runtimeconfig.jsonWebApplication1.staticwebassets.runtime.json(以前是 WebApplication1.staticwebassets.xml)在那里......但后来我发现神奇的是环境 ASPNETCORE_ENVIRONMENT 与这个问题有关。

到目前为止我尝试了什么?

命令中shell我把环境变量设置为

SET ASPNETCORE_ENVIRONMENT=Development

...然后开始然后我开始 WebApplication.exe,这种情况一切正常,提供静态 Web 资产。

问题

在非常简单的 Program.cs 和启动代码中,我没有看到任何关于 ASPNETCORE_ENVIRONMENT 变量的 条件逻辑 ,所以我不明白这个问题, 为什么不一样?(我也查过appsettings.jsonappsettings.Development.json两者的区别:没有相关的区别。

作为最终目标,我想自动启动 WebApplication.exe 以进行功能测试,有时我想以 ASPNETCORE_ENVIRONMENT=Development 启动它,但其他时候 没有那个设置。

为什么静态 Web 资产服务的差异取决于 ASPNETCORE_ENVIRONMENT=Development,以及如何在没有命令行设置的情况下 运行 和提供静态 Web 资产?

这个问题有点误导,因为 bin/Debug 文件夹中的工件用于调试而不是一般测试,因此不能保证它可以或应该像您描述的那样工作。

您发现它不起作用的原因是 bin/Debug 文件夹中没有静态资产。它适用于开发环境而不是生产环境(未设置环境时的默认设置)因为默认构建器仅在开发环境中调用UseStaticWebAssets

https://github.com/dotnet/aspnetcore/blob/4e7d976438b0fc17f435804e801d5d68d193ec33/src/DefaultBuilder/src/WebHost.cs#L221

UseStaticWebAssets 内,它处理 .staticwebssets.runtime.json 文件来解析静态资产的真实路径。这就是它的工作原理,也是为什么只有在开发环境中它才起作用的原因。

如果您想让它按预期运行,您应该将您的项目发布到一个文件夹并从那里调用可执行文件。发布工具还会将您的静态资产发布到该文件夹​​中,因此无论您是否设置环境配置,它都能正常工作。