为什么 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.json
和 WebApplication1.staticwebassets.runtime.json
(以前是 WebApplication1.staticwebassets.xml
)在那里......但后来我发现神奇的是环境 ASPNETCORE_ENVIRONMENT
与这个问题有关。
到目前为止我尝试了什么?
命令中shell我把环境变量设置为
SET ASPNETCORE_ENVIRONMENT=Development
...然后开始然后我开始 WebApplication.exe,这种情况一切正常,提供静态 Web 资产。
问题
在非常简单的 Program.cs 和启动代码中,我没有看到任何关于 ASPNETCORE_ENVIRONMENT
变量的 条件逻辑 ,所以我不明白这个问题, 为什么不一样?(我也查过appsettings.json
和appsettings.Development.json
两者的区别:没有相关的区别。
作为最终目标,我想自动启动 WebApplication.exe
以进行功能测试,有时我想以 ASPNETCORE_ENVIRONMENT=Development
启动它,但其他时候 没有那个设置。
为什么静态 Web 资产服务的差异取决于 ASPNETCORE_ENVIRONMENT=Development
,以及如何在没有命令行设置的情况下 运行 和提供静态 Web 资产?
这个问题有点误导,因为 bin/Debug 文件夹中的工件用于调试而不是一般测试,因此不能保证它可以或应该像您描述的那样工作。
您发现它不起作用的原因是 bin/Debug 文件夹中没有静态资产。它适用于开发环境而不是生产环境(未设置环境时的默认设置)因为默认构建器仅在开发环境中调用UseStaticWebAssets
。
在 UseStaticWebAssets
内,它处理 .staticwebssets.runtime.json
文件来解析静态资产的真实路径。这就是它的工作原理,也是为什么只有在开发环境中它才起作用的原因。
如果您想让它按预期运行,您应该将您的项目发布到一个文件夹并从那里调用可执行文件。发布工具还会将您的静态资产发布到该文件夹中,因此无论您是否设置环境配置,它都能正常工作。
这个标题会太长,但这是一个更孤立的问题:
为什么 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.json
和 WebApplication1.staticwebassets.runtime.json
(以前是 WebApplication1.staticwebassets.xml
)在那里......但后来我发现神奇的是环境 ASPNETCORE_ENVIRONMENT
与这个问题有关。
到目前为止我尝试了什么?
命令中shell我把环境变量设置为
SET ASPNETCORE_ENVIRONMENT=Development
...然后开始然后我开始 WebApplication.exe,这种情况一切正常,提供静态 Web 资产。
问题
在非常简单的 Program.cs 和启动代码中,我没有看到任何关于 ASPNETCORE_ENVIRONMENT
变量的 条件逻辑 ,所以我不明白这个问题, 为什么不一样?(我也查过appsettings.json
和appsettings.Development.json
两者的区别:没有相关的区别。
作为最终目标,我想自动启动 WebApplication.exe
以进行功能测试,有时我想以 ASPNETCORE_ENVIRONMENT=Development
启动它,但其他时候 没有那个设置。
为什么静态 Web 资产服务的差异取决于 ASPNETCORE_ENVIRONMENT=Development
,以及如何在没有命令行设置的情况下 运行 和提供静态 Web 资产?
这个问题有点误导,因为 bin/Debug 文件夹中的工件用于调试而不是一般测试,因此不能保证它可以或应该像您描述的那样工作。
您发现它不起作用的原因是 bin/Debug 文件夹中没有静态资产。它适用于开发环境而不是生产环境(未设置环境时的默认设置)因为默认构建器仅在开发环境中调用UseStaticWebAssets
。
在 UseStaticWebAssets
内,它处理 .staticwebssets.runtime.json
文件来解析静态资产的真实路径。这就是它的工作原理,也是为什么只有在开发环境中它才起作用的原因。
如果您想让它按预期运行,您应该将您的项目发布到一个文件夹并从那里调用可执行文件。发布工具还会将您的静态资产发布到该文件夹中,因此无论您是否设置环境配置,它都能正常工作。