我知道其他人也发布了此问题,但是我所见的解决方案都没有出现。我有一个ASP.NET WebAPI应用程序。我已经能够通过Visual Studio Publish将其发布到两个不同的开发服务器。在两个目标服务器上,我都通过Windows GUI将ASPNETCORE_ENVIRONMENT环境变量设置为Development,应用程序选择了此变量,使用了我的appSettings.Development.json设置,并按预期工作。
现在,我将其部署到我的测试服务器。在该服务器上,我通过Windows GUI将ASPNETCORE_ENVIRONMENT环境变量设置为Test,但是当应用程序运行时,它始终显示Hosting Environment:Production。我已经按照建议的方式检查了launchSettings.json文件,但其中没有任何内容将环境变量设置为Production。由于Production是默认设置,因此我没有在任何地方设置该值的代码。
我成功部署到Dev服务器和我失败部署到Test服务器都是通过Bamboo进行的dotnet发布完成的。 我不知道为什么在我的测试服务器上运行的应用程序没有选择ASPNETCORE_ENVIRONMENT测试设置。
我在周末想到的其他一些细节,可能或可能不相关。
VS将Publish发行到Windows Server 2008 R2,进行调试生成,可以正常工作。目标服务器的ASPNETCORE_ENVIRONMENT设置为Development,应用程序日志报告托管环境:Development和appSettings.Development.json设置有效。
VS Publish和Bamboo都(通过dotnet publish)部署到Windows Server 2016(调试生成)均按预期工作。我在该服务器上有该站点的两个实例。一个依赖于ASPNETCORE_ENVIRONMENT变量,该变量设置为Development,并且可以正常工作。另一个通过applicationHost.config中的设置覆盖其应用程序池的环境变量。在这两种情况下,应用程序都可以正确选择环境变量并反映正确的托管环境。
通过dotnet部署的竹子发布到Windows Server 2012发行版,无法正常工作。应用程序将托管环境报告为生产环境(默认),表明它无法获取我设置的环境变量。该应用程序失败,因为它缺少appSettings.Development.json中的应用程序设置。
因此,失败的情况是不同的服务器操作系统,但由于它同时适用于2008和2016,因此我认为它可以在2012上运行。失败的情况是发行版本与调试版本,但是我认为这不会影响运行时行为的重新配置。
我不认为这是launchSettings.json的问题,因为这可能会影响我的所有目标部署,而不仅仅是我的Test服务器。我已通过命令行确认正确设置了环境变量。我真的不想要一个基于web.config的解决方案,我认为我不需要它,而这将需要特定于环境的转换。
我尝试过的其他一些措施没有帮助: 将构建类型从“发行版”更改为“调试”(因为在工作环境中为“调试”)。仍然不起作用。 尝试记录其他环境变量,但是应用程序在进入我的记录代码之前就死了。仍在努力中... 尝试像在开发服务器上一样在applicationHost.config中设置环境变量,但是测试服务器是Windows Server 2012和IIS 8,并且不支持applicationHost.config中的元素。 (Dev服务器是Windows Server 2016和IIS 10,它确实支持applicationHost.config中的元素。) 尝试了VS发布与Bamboo部署。仍然不起作用。 我比较了开发服务器和测试服务器上的.NET Core安装。两者都有主机版本2.2.3,相同的提交。开发服务器已安装SDK;测试服务器没有。 Dev服务器已安装多个运行时版本,最新版本为2.2.3。测试服务器仅安装了2.2.3运行时。主要区别似乎在于SDK,我认为我不需要安装SDK即可读取环境变量。
答案 0 :(得分:0)
您是否尝试过在Web配置中设置此值?
<environmentVariables>
<environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Development" />
</environmentVariables>
答案 1 :(得分:0)
我想我已经解决了这个问题。我必须在IIS应用程序池高级设置中将LoadUserProfile设置为True。我不确定为什么会这样,因为我读过的东西说你需要这个来读取 user 环境变量,而我的应用无法读取 system 环境变量。但是,无论如何,当我在IIS应用程序池上将LoadUserProfile设置为true时,该应用程序都会正确读取ASPNETCORE_ENVIRONMENT系统环境变量,并且该应用程序将按预期运行。