Avoir un service de travail de base .net avec .net core version 3.1.8 et asp.net core version 3.1.8 Je rencontre un problème pour charger le secret utilisateur à partir du service worker, mais le même fonctionne dans le projet principal asp.net.
Méthode commune appelée à la fois depuis asp.net core et .net core worker service
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>(); }); }
csproj du service des travailleurs
<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>
startup.cs du service de travail
public static string GetFioApiKey(this IConfiguration configuration) => configuration["PaymentServiceSecrets:FioApiKey"];
trouvé ce lien vers le problème de github, a essayé d'appliquer la solution de contournement mais ne fonctionne toujours pas
3 Réponses :
tu devrais essayer ça
public static YourConfigObject GetFioApiKey(this IConfiguration configuration) => configuration.GetSection("PaymentServiceSecrets").Get<YourConfigObject>();
pourquoi configuration["PaymentServiceSecrets:FioApiKey"];
fonctionnerait dans le projet de l'API Web de base asp.net et non dans le projet de travail? votre code PaymentServiceSecrets
simplement fortement PaymentServiceSecrets
, sinon c'est le même
en mettant la ligne ci-dessous dans Program.cs
j'ai pu récupérer la valeur du secret utilisateur
hostContext.Configuration.GetSection("PaymentServiceSecrets:FioApiKey").Value
Un "piège" ici qui n'est pas mentionné est l'exigence que, dans WorkerServices, la variable d'environnement "DOTNET_ENVIRONMENT" doit être définie sur "Développement", sinon les Secrets d'utilisateurs n'essaieront même pas de se charger. Cela contraste avec la variable d'environnement "ASPNETCORE_ENVIRONMENT" utilisée dans les projets ASP.Net.
Ie, dans Properties / launchSettings.json
{ // .. Ommitted "profiles": { "MyWorkerService": { "commandName": "Project", "environmentVariables": { "DOTNET_ENVIRONMENT": "Development" } } } }
Habituellement, les nouveaux modèles de projet ont cela en place pour vous, mais dans mon cas, lors de la conversion de projets ASP.Net (qui n'avaient pas besoin de capacités de serveur Web) en services de travail, le profil launchSettings.json définit le "ASPNETCORE_ENVIRONMENT" sur " Développement "qui est effectivement inutile dans WorkerServices.
Attention, les user-secrets ne sont censés être utilisés que pendant le développement ( docs.microsoft.com/en-us/aspnet/core/security/… )