.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
  • IHostedService Uygulama

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:

.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.
  • Uygulama yapılandırmasını şu şekilde yükler:
    • appsettings.json.
    • Appsettings. {Environment}.json.
    • Uygulama ortamda çalıştır geldiğinde Gizli Gizli Development Yö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ı Development sağ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:

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:

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.
    • SIGINT (veya CTRL + C).
    • SIGQUIT (veya Windows + CTRL BREAK, Unix üzerinde CTRL). + \
    • SIGTERM (gibi diğer uygulamalar tarafından docker stop gönderilir).
  • 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:

Kapatılmış sıra diyagramı barındırma.

  1. Bu denetim, ConsoleLifetime ApplicationLifetime olayını yükseltmek için ' den ' a akar ApplicationStopping . WaitForShutdownAsyncYürütme kodunun engellemesini kaldırma sinyali Main . Bu sırada, POSIX sinyal işleyicisi, Cancel = true Bu POSIX sinyali işlendiği için ile birlikte döndürülür.
  2. MainYürütme kodu yeniden çalışmaya başlar ve konağa öğesine bildirir ve StopAsync() Bu da tüm barındırılan hizmetleri de durduruyor ve diğer durdurulan olayları yükseltir.
  3. Son olarak, WaitForShutdown tüm uygulama temizleme kodunun yürütülmesine izin vererek ve Main yöntemin düzgün bir şekilde çıkması için, çıkış yapın.

Ayrıca bkz.