.NET Core 3.1 Worker Service - 在发布时设置 EnvironmentName

Kar*_*kro 10 c# .net-core .net-core-3.1 asp.net-core-3.1

我正在尝试使用 VS 2019 Enterprise 提供的 asp.net core 3.1 模板设置工作服务。迄今为止:

1 / 创建一个新项目并运行它:“托管环境:开发”,按预期工作。

发展

发展

2 / 创建了一个 FileSystem 发布配置文件,并添加<EnvironmentName>Test</EnvironmentName>了将 worker 发布到测试环境的示例

<?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>
Run Code Online (Sandbox Code Playgroud)

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

生产

生产 ?

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

我还尝试手动生成一个 web.config 文件,其中包含

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

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

它在调试时适用于 VS,具有 DOTNET_ENVIRONMENT = Test

测试

测试

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

Ale*_*AIT 12

我推荐的方法是将相同的工件推送到您的所有环境,并将环境变量设置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
Run Code Online (Sandbox Code Playgroud)

另一种方法是在您的部署旁边发布一个 json 文件。

https://docs.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);
    });
Run Code Online (Sandbox Code Playgroud)

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

{
    "Environment": "test"
}
Run Code Online (Sandbox Code Playgroud)

现在您只需要使用与您想要的目标匹配的 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]
Run Code Online (Sandbox Code Playgroud)

  • @AlexAIT - 当我在部署后运行“dotnet {service}.dll”来启动服务时,“hostsettings.json”文件方法有效,但当我使用“sc create {service}”然后“sc start {service}”时则无效。有什么想法吗? (3认同)