.NET Genel Ana Bilgisayarı
Çalışan Hizmeti şablonları bir .NET Genel Ana Bilgisayarı oluşturur, HostBuilder . Genel Ana Bilgisayar, Konsol uygulamaları gibi diğer .NET uygulaması türleriyle kullanılabilir.
Konak, bir uygulamanın kaynaklarını ve yaşam süresi işlevselliğini kapsüller, örneğin:
- Bağımlılık ekleme (DI)
- Günlüğe Kaydetme
- Yapılandırma
- Uygulama kapatma
IHostedServiceUygulama
Bir konak başlatıldığında, hizmet IHostedService.StartAsync kapsayıcısı tarafından barındırılan hizmetler koleksiyonuna kaydedilen IHostedService her bir uygulamasını çağırır. Bir çalışan hizmeti uygulamasında, IHostedService örnekleri içeren tüm uygulamalar kendi BackgroundService BackgroundService.ExecuteAsync yöntemlerine çağrılır.
Uygulamanın bağımlı olan tüm kaynaklarını tek bir nesneye dahil etmek için temel neden, yaşam süresi yönetimidir: uygulama başlatma ve yetkisiz kapatma üzerinde denetim. Bu, Microsoft.Extensions.Hosting NuGet sağlanır.
Konak ayarlama
Konak genellikle sınıfındaki kod tarafından yapılandırılır, yapılandırılır, yapılandırılır ve Program çalıştırıldığında. Mainyöntemi:
- Oluşturucu nesnesi CreateDefaultBuilder() oluşturmak ve yapılandırmak için bir yöntem çağıran.
- Örnek Build() oluşturmak için IHost çağrıları.
- Konak Run RunAsync nesnede veya yöntemini arar.
.NET Çalışan Hizmeti şablonları, Genel Konak oluşturmak için aşağıdaki kodu oluşturur:
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>();
});
}
Varsayılan oluşturucu ayarları
CreateDefaultBuilderyöntemi:
- İçerik kökünü tarafından döndürülen yola GetCurrentDirectory() ayarlar.
- Konak yapılandırmasını şu şekilde yükler:
- ön ekli ortam
DOTNET_değişkenleri. - Komut satırı bağımsız değişkenleri.
- ön ekli ortam
- Uygulama yapılandırmasını şu şekilde yükler:
- appsettings.json.
- Appsettings. {Environment}.json.
- Uygulama ortamda çalıştır geldiğinde Gizli Gizli
DevelopmentYönetici. - Ortam değişkenleri.
- Komut satırı bağımsız değişkenleri.
- Aşağıdaki günlük sağlayıcılarını ekler:
- Konsol
- Hata Ayıklama
- EventSource
- EventLog (yalnızca Windows)
- Ortam olduğunda kapsam doğrulama ve bağımlılık doğrulamasını
Developmentsağlar.
ConfigureServicesyöntemi, örneğine hizmet ekleme becerisini Microsoft.Extensions.DependencyInjection.IServiceCollection ortaya çıkarır. Daha sonra, bu hizmetler bağımlılık eklemeden kullanılabilir.
Çerçeve tarafından sağlanan hizmetler
Aşağıdaki hizmetler otomatik olarak kaydedilir:
IHostApplicationLifetime
Başlatma sonrası IHostApplicationLifetime ve yetkisiz kapatma görevlerini işlemek için hizmeti herhangi bir sınıfa ekleyin. Arabirimde üç özellik, uygulama başlatma ve uygulama durdurma olay işleyicisi yöntemlerini kaydetmek için kullanılan iptal belirteçleridir. Arabirim bir yöntem de StopApplication() içerir.
Aşağıdaki örnek, olayları IHostedService kaydeden bir IHostApplicationLifetime uygulamadır:
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
namespace AppLifetime.Example;
public class ExampleHostedService : IHostedService
{
private readonly ILogger _logger;
public ExampleHostedService(
ILogger<ExampleHostedService> logger,
IHostApplicationLifetime appLifetime)
{
_logger = logger;
appLifetime.ApplicationStarted.Register(OnStarted);
appLifetime.ApplicationStopping.Register(OnStopping);
appLifetime.ApplicationStopped.Register(OnStopped);
}
public Task StartAsync(CancellationToken cancellationToken)
{
_logger.LogInformation("1. StartAsync has been called.");
return Task.CompletedTask;
}
public Task StopAsync(CancellationToken cancellationToken)
{
_logger.LogInformation("4. StopAsync has been called.");
return Task.CompletedTask;
}
private void OnStarted()
{
_logger.LogInformation("2. OnStarted has been called.");
}
private void OnStopping()
{
_logger.LogInformation("3. OnStopping has been called.");
}
private void OnStopped()
{
_logger.LogInformation("5. OnStopped has been called.");
}
}
Çalışan Hizmeti şablonu, uygulama eklemek için ExampleHostedService değiştirilebilir:
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
namespace AppLifetime.Example;
class Program
{
static Task Main(string[] args) =>
CreateHostBuilder(args).Build().RunAsync();
static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureServices((_, services) =>
services.AddHostedService<ExampleHostedService>());
}
Uygulama aşağıdaki örnek çıkışı yazar:
// Sample output:
// info: ExampleHostedService[0]
// 1. StartAsync has been called.
// info: ExampleHostedService[0]
// 2. OnStarted has been called.
// info: Microsoft.Hosting.Lifetime[0]
// Application started.Press Ctrl+C to shut down.
// info: Microsoft.Hosting.Lifetime[0]
// Hosting environment: Production
// info: Microsoft.Hosting.Lifetime[0]
// Content root path: ..\app-lifetime\bin\Debug\net5.0
// info: ExampleHostedService[0]
// 3. OnStopping has been called.
// info: Microsoft.Hosting.Lifetime[0]
// Application is shutting down...
// info: ExampleHostedService[0]
// 4. StopAsync has been called.
// info: ExampleHostedService[0]
// 5. OnStopped has been called.
IHostLifetime
Uygulama, IHostLifetime ana bilgisayar başlatıldığında ve durduğunda kontrol eder. Kaydedilen son uygulama kullanılır. Microsoft.Extensions.Hosting.Internal.ConsoleLifetime varsayılan IHostLifetime uygulamadır. Kapatmanın yaşam süresi mekaniği hakkında daha fazla bilgi için bkz. Konak kapatma.
IHostEnvironment
Aşağıdaki IHostEnvironment ayarlar hakkında bilgi almak için hizmeti bir sınıfına ekleme:
- IHostEnvironment.ApplicationName
- IHostEnvironment.ContentRootFileProvider
- IHostEnvironment.ContentRootPath
- IHostEnvironment.EnvironmentName
Konak yapılandırması
Konak yapılandırması, IHostEnvironment uygulamasının özelliklerini yapılandırmak için kullanılır.
Konak yapılandırması, yöntemi içindeki HostBuilderContext.Configuration içinde ConfigureAppConfiguration kullanılabilir. yöntemi ConfigureAppConfiguration çağrılırken, HostBuilderContext ve IConfigurationBuilder içine configureDelegate geçirildi. configureDelegate, olarak Action<HostBuilderContext, IConfigurationBuilder> tanımlanır. Konak oluşturucu bağlamı, bir .Configuration örneği olan özelliğini ortaya IConfiguration çıkarır. Konaktan yapılandırılan yapılandırmayı temsil ederken, IConfigurationBuilder uygulamayı yapılandırmak için kullanılan oluşturucu nesnesidir.
İpucu
çağrıldıktan ConfigureAppConfiguration HostBuilderContext.Configuration sonra, uygulama yapılandırması ile değiştirilir.
Konak yapılandırması eklemek için üzerinde ConfigureHostConfiguration çağrısı IHostBuilder ekleyin. ConfigureHostConfiguration eklenebilir sonuçlarla birden çok kez çağrıl olabilir. Konak, belirli bir anahtarda en son değer ayarlayacak seçeneği kullanır.
Aşağıdaki örnek konak yapılandırması oluşturur:
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
class Program
{
static async Task Main(string[] args)
{
using IHost host = CreateHostBuilder(args).Build();
// Application code should start here.
await host.RunAsync();
}
static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureHostConfiguration(configHost =>
{
configHost.SetBasePath(Directory.GetCurrentDirectory());
configHost.AddJsonFile("hostsettings.json", optional: true);
configHost.AddEnvironmentVariables(prefix: "PREFIX_");
configHost.AddCommandLine(args);
});
}
Uygulama yapılandırması
Uygulama yapılandırması, üzerinde çağrılarak ConfigureAppConfiguration IHostBuilder oluşturulur. ConfigureAppConfiguration eklenebilir sonuçlarla birden çok kez çağrıl olabilir. Uygulama, belirli bir anahtarda en son değer ayaran seçeneği kullanır.
tarafından oluşturulan yapılandırma, ConfigureAppConfiguration sonraki işlemler için HostBuilderContext.Configuration içinde ve DI'den bir hizmet olarak kullanılabilir. Konak yapılandırması, uygulama yapılandırmasına da eklenir.
Daha fazla bilgi için bkz. .NET'te yapılandırma.
Konak kapatma
Barındırılan bir hizmet işlemi aşağıdaki yollarla durdurulabilirsiniz:
- Birisi veya çağrısında yoksa Run HostingAbstractionsHostExtensions.WaitForShutdown ve uygulama tamamladıktan sonra normal bir şekilde
Mainçıkar. - Uygulama kilitleniyorsa.
- Uygulama SIGKILL (veya CTRLZ) kullanılarak zorla + kapatıldı ise.
Bu senaryoların hepsi doğrudan barındırma kodu tarafından iş değildir. Sürecin sahibinin tüm uygulamalarla aynı şekilde işlem sahibi olması gerekir. Barındırılan bir hizmet işleminin durdurulma yollarından birkaçı daha vardır:
ConsoleLifetimekullanılırsa, aşağıdaki sinyalleri dinler ve ana bilgisayarı uygun şekilde durdurmaya çalışır.- Uygulama çağrısında Environment.Exit bulundursa.
Bu senaryolar, özellikle sınıfı olmak üzere yerleşik barındırma mantığı tarafından ConsoleLifetime ele almaktadır. ConsoleLifetime , uygulamada yetkisiz bir çıkışa izin vermek için SIGINT, SIGQUIT ve SIGTERM sinyallerini "kapatma" işlemiyle işlemeye çalışır.
.NET 6'dan önce, .NET kodunun SIGTERM'i tam olarak işlemesi için bir yol yoktu. Bu sınırlamaya bir çözüm ConsoleLifetime olarak, aboneliğine abone System.AppDomain.ProcessExit olur. Ne ProcessExit zaman ConsoleLifetime yükseltildi, ana bilgisayar durdurmak ve iş parçacığını engellemek için ana bilgisayar ProcessExit için bekleyen sinyal olur.
Bu, uygulamanın temizleme kodunun örneğin çalışmasına ve yönteminde sonra — IHost.StopAsync kodun HostingAbstractionsHostExtensions.Run çalışmasına olanak Main sağlar.
Bu, SIGTERM'in ortaya çıkan tek yol olmadığı için diğer ProcessExit sorunlara neden oldu. Ayrıca uygulama çağıran kod tarafından da yükseltilir Environment.Exit . Environment.Exit Uygulama modelinde bir işlemi kapatmak için düzgün bir yöntem değildir Microsoft.Extensions.Hosting . ProcessExitOlayı oluşturur ve işlemden çıkar. MainMetodun sonu yürütülmedi. Arka plan ve ön plan iş parçacıkları sonlandırılır ve finally bloklar yürütülmez.
ConsoleLifetime ProcessExit Bu durum, engellenen konağın kapatılmasını beklerken, bu davranış kilitlenme durumundan Environment.Exit geri dönmesi için beklemeyi da engeller ProcessExit . Ek olarak, SIGTERM işleme işlemi sorunsuz bir şekilde kapatmaya çalıştığı için, ' ı ' a ayarlar ve bu da ConsoleLifetime ExitCode 0 kullanıcının çıkış kodunu geçti olarak ayarlar Environment.Exit .
.NET 6 ' da, POSIX sinyalleri desteklenir ve işlenir. Bu ConsoleLifetime , Sigara 'un sorunsuz bir şekilde işlemesini sağlar ve çağrıldığında artık dahil değildir Environment.Exit .
İpucu
.NET 6 + için ConsoleLifetime artık senaryoyu işleme mantığı yoktur Environment.Exit . Environment.ExitTemizleme mantığını çağıran ve yapması gereken uygulamalar kendilerine abone olabilir ProcessExit . Barındırma, artık bu senaryodaki ana bilgisayarı sorunsuz bir şekilde durdurmayı denemeyecek.
Uygulamanız barındırma kullanıyorsa ve Konağı düzgün bir şekilde durdurmak istiyorsanız, yerine öğesini çağırabilirsiniz IHostApplicationLifetime.StopApplication Environment.Exit .
Barındırma kapalı işlemi
Aşağıdaki sıralı diyagramda, sinyallerin barındırma kodunda dahili olarak nasıl işlendiği gösterilmektedir. Çoğu kullanıcının bu işlemi anlaması gerekli değildir. Ancak derin bir şekilde anlaşılmasını gerektiren geliştiriciler için bu, başlamanıza yardımcı olabilir.
Konak başlatıldıktan sonra, bir kullanıcı veya çağırdığında bir Run WaitForShutdown işleyici için kaydedilir IApplicationLifetime.ApplicationStopping . Yürütme, WaitForShutdown ApplicationStopping olayın ortaya çıkarılmasını bekleyen ' de duraklatıldı. Bu Main Yöntem, yöntemin hemen geri dönmez ve uygulamanın çalışmaya Run veya dönüşene kadar çalışır durumda kalır WaitForShutdown .
İşleme bir sinyal gönderildiğinde, aşağıdaki sırayı başlatır:
- Bu denetim,
ConsoleLifetimeApplicationLifetimeolayını yükseltmek için ' den ' a akarApplicationStopping.WaitForShutdownAsyncYürütme kodunun engellemesini kaldırma sinyaliMain. Bu sırada, POSIX sinyal işleyicisi,Cancel = trueBu POSIX sinyali işlendiği için ile birlikte döndürülür. MainYürütme kodu yeniden çalışmaya başlar ve konağa öğesine bildirir veStopAsync()Bu da tüm barındırılan hizmetleri de durduruyor ve diğer durdurulan olayları yükseltir.- Son olarak,
WaitForShutdowntüm uygulama temizleme kodunun yürütülmesine izin vererek veMainyöntemin düzgün bir şekilde çıkması için, çıkış yapın.
Ayrıca bkz.
- .NET 'e bağımlılık ekleme
- .NET oturumu açma
- .NET 'teki yapılandırma
- .NET 'teki çalışan hizmetleri
- ASP.NET Core Web ana bilgisayarı
- Genel ana bilgisayar hataları GitHub.com/DotNet/Extensions deposu 'nda oluşturulmalıdır