I have been looking at a number of tutorials and SO questions (such as App Settings .Net Core) regarding reading appsettings.json in .Net Core 3 and I cannot find any pointers on how-to when dealing with the Worker service. There is no Startup method. Instead, I have a Program.cs with the main method:
public class Program { public static void Main(string[] args) { CreateHostBuilder(args).Build().Run(); } public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureServices((hostContext, services) => { services.AddHostedService<Worker>(); }); }
How do I go about reading from the appsettings.json file in a Worker Service Project in .Net Core 3?
I have added a reference to a custom WCF client I created with .Net v4.8 and another project that has just all the Busines Domain Object shared between the whole solution. My solution is primarily .Net v4.8 and I want to use the Worker Service. The Client project creates a WCF Client internally by code so all binding and endpoints are configurable. If this were a .Net v4.8 project, I'd add the following to the app.config:
<appSettings> ... <add key="AminServiceUri" value="http://localhost:45108/ServiceHost/v1/AminService.svc" /> <add key="BillServiceUri" value="http://localhost:45108/ServiceHost/v1/BillService.svc" /> <add key="CustomerServiceUri" value="http://localhost:45108/ServiceHost/v1/CustomerService.svc" /> <add key="EpayServiceUri" value="http://localhost:45108/ServiceHost/v1/EpayService.svc" /> <add key="FinanceServiceUri" value="http://localhost:45108/ServiceHost/v1/FinanceService.svc" /> <add key="GrpServiceUri" value="http://localhost:45108/ServiceHost/v1/GrpService.svc" /> <add key="MetaServiceUri" value="http://localhost:45108/ServiceHost/v1/MetaService.svc" /> <add key="ReportServiceUri" value="http://localhost:45108/ServiceHost/v1/ReportService.svc" /> <add key="ServiceInfoServiceUri" value="http://localhost:45108/ServiceHost/v1/ServiceInfoService.svc" /> <add key="UsersServiceUri" value="http://localhost:45108/ServiceHost/v1/UsersService.svc" /> ... <add key="ExcessiveLogging" value="false" /> ... </appSettings>
Now I need these settings to be in the new JSON format and read them in.
Edit
This is a fresh project. The worker is not doing anything:
public class Worker : BackgroundService { private readonly ILogger<Worker> logger; public Worker(ILogger<Worker> logger) { this.logger = logger; } protected override async Task ExecuteAsync(CancellationToken stoppingToken) { while (!stoppingToken.IsCancellationRequested) { logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now); await Task.Delay(5000, stoppingToken); } } }
And here is how I get this project type:
Application configuration in ASP.NET Core is performed using one or more configuration providers. Configuration providers read configuration data from key-value pairs using a variety of configuration sources: Settings files, such as appsettings. json.
The ConfigureServices method is a place where you can register your dependent classes with the built-in IoC container. After registering dependent class, it can be used anywhere in the application. You just need to include it in the parameter of the constructor of a class where you want to use it.
Worker Services were introduced in . NET Core 3.0, and allows for running background services through the use of a hosted service. Another way of running background services is to run hosted services within an ASP.NET Core web application.
If for example the worker class needed access to some data stored in your appsettings
public class Worker : BackgroundService { private readonly ILogger<Worker> logger; private readonly WorkerOptions options; public Worker(ILogger<Worker> logger, WorkerOptions options) { this.logger = logger; this.options = options; } protected override async Task ExecuteAsync(CancellationToken stoppingToken) { while (!stoppingToken.IsCancellationRequested) { //do something that uses options logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now); await Task.Delay(5000, stoppingToken); } } }
Where WorkerOptions
stores your values from configuration.
public class WorkerOptions { public string AminServiceUri { get; set; } public string BillServiceUri { get; set; } //... other properties }
Which assumes the appsettings.json file has the corresponding keys
{ "WCF": { "AminServiceUri":"http://localhost:45108/ServiceHost/v1/AminService.svc", "BillServiceUri":"http://localhost:45108/ServiceHost/v1/BillService.svc", //...other key-value pairs }, "Logging": { "ExcessiveLogging": false } }
By default Host.CreateDefaultBuilder
will set up the usual configuration (appsettings.json et al).
Use hostContext.Configuration
to get the IConfiguration
instance that can be used to access the desired settings and add the strongly typed object model for it. Add that object to the service collection so that it can be injected where needed
For example
public class Program { public static void Main(string[] args) { CreateHostBuilder(args).Build().Run(); } public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureServices((hostContext, services) => { IConfiguration configuration = hostContext.Configuration; WorkerOptions options = configuration.GetSection("WCF").Get<WorkerOptions>(); services.AddSingleton(options); services.AddHostedService<Worker>(); }); }
When the worker is being created it will be injected with its required dependencies.
Reference Configuration in ASP.NET Core
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With