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

g.p*_*dou 2 kestrel-http-server asp.net-core

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

为什么 ASP.NET Core Web 应用程序在从命令行启动时不提供静态 Web 资源并且ASPNETCORE_ENVIRONMENT未设置 或设置为除 之外的任何其他值"Development"

语境

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

我能够在 IIS Express 下运行我的 ASP.NET Core Web 应用程序,或者使用 Visual Studio在没有launchsettings.json.IIS Express 的情况下运行我的 ASP.NET Core Web 应用程序,基于,我的意思是使用绿色三角形下拉列表,然后选择 WebApplication 而不是 IIS Express


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

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

到目前为止我已经尝试过什么?

在命令 shell 中,我将环境变量设置为

SET ASPNETCORE_ENVIRONMENT=Development
Run Code Online (Sandbox Code Playgroud)

...然后开始,然后我启动了 WebApplication.exe,这种情况下一切正常,静态 Web 资源已提供服务。

问题

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

作为最终目标,我希望自动启动用于功能测试的目的,并且有时WebApplication.exe我希望在没有该设置的情况下启动它。ASPNETCORE_ENVIRONMENT=Development

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

tia*_*tia 7

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

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

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

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

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