.net core Worker Service (BackgroundService) 无法加载用户机密

pan*_*mic 5 c# .net-core asp.net-core

拥有 .net core 版本 3.1.8 和 asp.net core 版本 3.1.8 的 .net core 工作服务 我在从工作服务加载用户密钥时遇到问题,但在 asp.net core 项目中同样有效。

从 ASP.NET Core 和 .NET Core Worker 服务调用的通用方法

public static string GetFioApiKey(this IConfiguration configuration)
            => configuration["PaymentServiceSecrets:FioApiKey"];
Run Code Online (Sandbox Code Playgroud)

工人服务的 csproj

<Project Sdk="Microsoft.NET.Sdk.Worker">

  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <UserSecretsId>8d19c97d-a2fb-4a51-a694-9635b9c0c42c</UserSecretsId>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.Extensions.Hosting" Version="3.1.8" />
    <PackageReference Include="Microsoft.Extensions.Configuration.UserSecrets" Version="3.1.8" />
  </ItemGroup>
</Project>
Run Code Online (Sandbox Code Playgroud)

Worker服务的startup.cs

public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureAppConfiguration(config => config.AddUserSecrets(Assembly.GetExecutingAssembly()))
                .ConfigureServices((hostContext, services) =>
                {
                    // simplified
                    

                    services.AddSingleton<IApplicationSettings>(applicationSettings =>
                    {
                        var appSettings = new ApplicationSettings
                        {
                            FioApiKey = config.GetFioApiKey()
                        };

                        
                        return appSettings;
                    });

                    services.AddHostedService<Worker>();
                });
    }
Run Code Online (Sandbox Code Playgroud)

找到了github 问题的链接,尝试应用解决方法但仍然不起作用

Bry*_*n W 11

这里没有提到的一个“问题”是,在 WorkerServices 中,环境变量“DOTNET_ENVIRONMENT”必须设置为“Development”,否则用户密钥甚至不会尝试加载。这与 ASP.Net 项目中使用的“ASPNETCORE_ENVIRONMENT”环境变量形成对比。

即,在 Properties/launchSettings.json 中

{
  // .. Ommitted
  "profiles": {
    "MyWorkerService": {
      "commandName": "Project",
      "environmentVariables": {
        "DOTNET_ENVIRONMENT": "Development"
      }
    }
  }
}

Run Code Online (Sandbox Code Playgroud)

通常,新的项目模板已经为您准备好了这一点,但就我而言,当将 ASP.Net 项目(不需要 Web 服务器功能)转换为 Worker Services 时,launchSettings.json 配置文件将“ASPNETCORE_ENVIRONMENT”设置为“开发”,这在 WorkerServices 中实际上毫无用处。


小智 0

你应该试试这个

public static YourConfigObject GetFioApiKey(this IConfiguration configuration)
            => configuration.GetSection("PaymentServiceSecrets").Get<YourConfigObject>();
Run Code Online (Sandbox Code Playgroud)