.NET Core 3.1 工作服务 - 环境特定配置

10
我正在尝试使用VS 2019 Enterprise提供的asp.net core 3.1模板设置工作服务。到目前为止:
1/ 创建了一个新项目并运行它:“Hosting Environment: Development”,符合预期。
开发

Development

2 / 创建了一个文件系统发布配置文件,并添加了<EnvironmentName>Test</EnvironmentName>以将工作程序发布到测试环境中,例如

<?xml version="1.0" encoding="utf-8"?>
<!--
https://go.microsoft.com/fwlink/?LinkID=208121. 
-->
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <PublishProtocol>FileSystem</PublishProtocol>
    <Configuration>Release</Configuration>
    <Platform>Any CPU</Platform>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <PublishDir>bin\Release\netcoreapp3.1\publish\</PublishDir>
    <EnvironmentName>Test</EnvironmentName>
  </PropertyGroup>
</Project>

发布版本启动时,HostingEnvironment被设置为“Production”,但我在FolderProfile.pubxml中定义了“Test”。

生产

Production ?

我尝试过dotnet publish /p:EnvironmentName=Test,但没有成功。

我还尝试手动生成一个包含以下内容的web.config文件:

<environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Test" />

工作服务似乎忽略了web.config文件。

在VS调试时,使用DOTNET_ENVIRONMENT = Test可以正常工作。

测试

Test

在不同的环境中发布工作服务的正确方式是什么?


这个程序在哪里托管?IIS,自托管?请提供更多细节。此外,还有两个环境变量DOTNET_EINVIRONMENT和ASPNETCORE_ENVIRONMENT。Web.config仅在IIS托管时起作用。您是否检查了要发布到的机器上实际存在的环境变量? - Jonathan Alfaro
2
提供的截图是从本地调试中获取的。最终目标是将此工作程序托管在 Windows Server 2012 R2 上作为 Windows 服务(并管理不同的环境),使用 Microsoft.Extensions.Hosting.WindowsServices,Version=3.1.1.0。这种方法(具有多个发布配置文件并针对多个环境进行修改)适用于托管在 IIS 上的经典 ASP.NET Core 应用程序,该应用程序使用 ASPNETCORE_ENVIRONMENT。工作程序模板使用 DOTNET_ENVIRONMENT,我不确定如何修改和管理它。 - Karuskrokro
环境变量是在操作系统级别管理的。通常我这样做的方式是在部署应用程序之前将这些变量已经设置为目标服务器上它们正确的值。因此,我可能有一些服务器的环境变量设置为“测试”,另外一些服务器可能设置为“生产”。请记住,您可以拥有任何您决定的环境。这意味着您不仅限于“开发”、“测试”、“生产”等名称。 - Jonathan Alfaro
2个回答

15

我建议的方法是将相同的构件推送到您所有的环境中,并将环境变量 DOTNET_ENVIRONMENT 设置为您所需的值。

SET DOTNET_ENVIRONMENT=test2
dotnet WorkerService1.dll

info: WorkerService1.Worker[0]
      Worker running at: 03/18/2020 17:27:34 +01:00
info: Microsoft.Hosting.Lifetime[0]
      Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
      Hosting environment: test2

另一种方法是在部署时发布一个json文件。

https://learn.microsoft.com/en-us/aspnet/core/fundamentals/host/generic-host?view=aspnetcore-3.1

// using Microsoft.Extensions.Configuration;

Host.CreateDefaultBuilder(args)
    .ConfigureHostConfiguration(configHost =>
    {
        configHost.SetBasePath(Directory.GetCurrentDirectory());
        configHost.AddJsonFile("hostsettings.json", optional: true);
        configHost.AddEnvironmentVariables(prefix: "PREFIX_");
        configHost.AddCommandLine(args);
    });

您的hostsettings.json文件的内容可能是:

{
    "Environment": "test"
}
现在,您只需要使用与所需目标匹配的json文件,并将其复制到DLL旁边。
dotnet WorkerService1.dll

info: WorkerService1.Worker[0]
      Worker running at: 03/18/2020 17:06:03 +01:00
info: Microsoft.Hosting.Lifetime[0]
      Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
      Hosting environment: test
info: Microsoft.Hosting.Lifetime[0]

一个注意点是,目标是将此Worker作为Windows服务托管在Windows Server 2012上,使用Microsoft.Extensions.Hosting.WindowsServices, Version=3.1.1.0。在使用sc create / start时,如何将Artifact推送到所需的值?否则,我将只使用“hostsettings.json”文件。 - Karuskrokro
想法是为整个系统设置环境变量DOTNET_ENVIRONMENT,例如setx DOTNET_ENVIRONMENT test /M。如果您无法这样做或更愿意使用自包含的解决方案,则应该选择JSON文件。 - Alex AIT
1
Windows服务器托管了测试和预生产环境,因此我将坚持使用JSON文件,并且不幸的是需要为每个部署手动更新文件(或稍后找到一个可以自动更新的部署过程)。谢谢! - Karuskrokro
1
我在StackOverflow和互联网上到处寻找答案,最终我找到了一个简单明了的答案。谢谢! - Caltor
3
@AlexAIT - 当我在部署后运行 dotnet {service}.dll 启动服务时,hostsettings.json 文件的方法有效,但当我使用 sc create {service} 然后 sc start {service} 时,该方法无效。你有什么想法吗? - Developer Guy

2

如果有人遇到了这个问题,我希望你能得到帮助。

通过查看 Host.CreateDefaultBuilder 源代码,我们可以发现可以从传递的参数中设置 DOTNET_[变量]。

因此,要在开发环境中运行您的服务,请运行以下命令:

dotnet DLL:

dotent [DllName].dll --ENVIRONMENT=Development

exe:

[ExeName].exe --ENVIRONMENT=Development

Dotnet core源代码:

DotNet Core源代码


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接