Windows Hizmette ASP.NET Core Barındırma

Bir ASP.NET Core uygulama, IIS Windows bir Windows Hizmeti olarak barındırabilirsiniz. Windows Hizmeti olarak barındırılırsa, sunucu yeniden başlatıldıktan sonra uygulama otomatik olarak başlatılır.

Örnek kodu görüntüleme veya indirme ( nasılindir)

Önkoşullar

Çalışan Hizmeti şablonu

ASP.NET Core Çalışan Hizmeti şablonu, uzun süre çalışan hizmet uygulamaları yazmak için bir başlangıç noktası sağlar. Şablonu bir Windows Service uygulaması için temel olarak kullanmak için:

  1. .NET Core şablonundan bir Çalışan Hizmeti uygulaması oluşturun.
  2. Uygulama yapılandırması bölümündeki yönergeleri takip edin ve Çalışan Hizmeti uygulamasını bir Windows Hizmeti olarak çalıştıracak şekilde güncelleştirin.
  1. Yeni bir proje oluşturma.
  2. Çalışan hizmeti seçin. İleri’yi seçin.
  3. Proje adı alanında bir proje adı girin veya varsayılan proje adını kabul edin. Oluştur’u seçin.
  4. Yeni çalışan hizmeti oluştur Iletişim kutusunda Oluştur' u seçin.

Uygulama yapılandırması

Uygulama, Microsoft.Extensions.Hosting.WindowsServices için bir paket başvurusu gerektirir.

IHostBuilder.UseWindowsService , konak inşası için çağrılır. Uygulama Windows Service olarak çalışıyorsa yöntemi:

  • Konak ömrünü olarak WindowsServiceLifetime ayarlar.
  • İçerik kökünü AppContext.BaseDirectory olarak ayarlar. Daha fazla bilgi için Geçerli dizin ve içerik kökü bölümüne bakın.
  • Olay günlüğüne kaydetmeyi sağlar:
    • Uygulama adı varsayılan kaynak adı olarak kullanılır.
    • Varsayılan günlük düzeyi, ana bilgisayarı derlemek için çağıran bir ASP.NET Core tabanlı uygulama için Uyarı CreateDefaultBuilder veya daha yüksek bir düzeydir.
    • Appsettings'te anahtarıyla Logging:EventLog:LogLevel:Default varsayılan günlük düzeyini geçersiz appsettings.json / kılın.{ Environment}.json veya diğer yapılandırma sağlayıcısı.
    • Yalnızca yöneticiler yeni olay kaynakları oluşturabilir. Uygulama adı kullanılarak bir olay kaynağı oluşturulamaysa, Uygulama kaynağına bir uyarı kaydedilir ve olay günlükleri devre dışı bırakılır.

CreateHostBuilder Program.cs içinde:

Host.CreateDefaultBuilder(args)
    .UseWindowsService()
    ...

Aşağıdaki örnek uygulamalar bu konuya eşlik eder:

  • Arka Plan Çalışanı Hizmeti Örneği: Arka plan görevleri için barındırılan hizmetleri kullanan Çalışan Hizmeti şablonunu temel alan web uygulaması olmayan bir örnek.
  • Web App Service Örneği: Arka plan görevleri için barındırılan hizmetlerle birlikte Windows Hizmeti olarak çalışan Razor sayfalar web uygulaması örneği.

MVC kılavuzu için ve altındaki makalelere ASP.NET Core MVC’ye Genel Bakış ASP.NET Core 2,2 ' den 3,0 ' e geçiş yapın bakın.

Dağıtım türü

Dağıtım senaryoları hakkında bilgi ve öneriler için bkz. .NET Core uygulama dağıtımı.

SDK

Sayfalar veya MVC çerçevelerini kullanan web uygulaması tabanlı bir hizmet için proje dosyasında Razor Web SDK'sini belirtin:

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

Hizmet yalnızca arka plan görevlerini yürütürse (örneğin, barındırılan hizmetler),proje dosyasında Çalışan SDK'sı belirtin:

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

Çerçeveye bağımlı dağıtım (FDD)

Çerçeveye bağımlı dağıtım (FDD), hedef sistemde paylaşılan sistem genelinde .NET Core sürümünün varlığına bağlıdır. Bu makaledeki kılavuza göre FDD senaryosu benimsenmiş olduğunda SDK, çerçeveye bağımlı yürütülebilir dosya olarak adlandırılan bir yürütülebilir dosya (.exe) üretir.

WebSDK'sı kullanıyorsanız,web.config bir ASP.NET Core uygulaması yayımlarken üretilen bir Windows Dosyası gereksizdir. Dosyanın oluşturulmasını devre web.config için, olarak ayarlanmış <IsTransformWebConfigDisabled> özelliğini true ekleyin.

<PropertyGroup>
  <TargetFramework>netcoreapp3.0</TargetFramework>
  <IsTransformWebConfigDisabled>true</IsTransformWebConfigDisabled>
</PropertyGroup>

Kendi içinde dağıtım (SCD)

Kendi içinde dağıtım (SCD), konak sistemde paylaşılan bir çerçevenin varlığına güvenmez. Çalışma zamanı ve uygulamanın bağımlılıkları uygulamayla birlikte dağıtılır.

Hedef Windows içeren çalışma zamanı tanımlayıcısı (RID) dahil <PropertyGroup> edilir:

<RuntimeIdentifier>win7-x64</RuntimeIdentifier>

Birden çok RI'ye yayımlamak için:

  • NOKTALı virgülle ayrılmış bir listede RID'leri sağlar.
  • Özellik adını <RuntimeIdentifiers> (çoğul) kullanın.

Daha fazla bilgi için bkz. .NET Core RID Kataloğu.

Hizmet kullanıcı hesabı

Bir hizmet için kullanıcı hesabı oluşturmak üzere, yönetimsel bir PowerShell 6 komut kabuğundan New-LocalUser cmdlet'ini kullanın.

Windows 10 Ekim 2018 Güncelleştirmesi (sürüm 1809/build 10.0.17763) veya sonraki sürümler:

New-LocalUser -Name {SERVICE NAME}

Windows önceki işletim sistemi Windows 10 Ekim 2018 Güncelleştirmesi (sürüm 1809/derleme 10.0.17763):

powershell -Command "New-LocalUser -Name {SERVICE NAME}"

İstendiğinde güçlü bir parola girin.

-AccountExpires New-LocalUser cmdlet'ine süre sonu ile parametresi sağlanmadısa, DateTime hesabın süresi dolmaz.

Daha fazla bilgi için bkz. Microsoft.PowerShell.LocalAccounts ve Hizmet Kullanıcı Hesapları.

Active Directory kullanırken kullanıcıları yönetmeye alternatif bir yaklaşım, Yönetilen Hizmet Hesaplarını kullanmaktır. Daha fazla bilgi için bkz. Grup Tarafından Yönetilen Hizmet Hesaplarına Genel Bakış.

Hizmet hakları olarak oturum açma

Hizmet kullanıcı hesabı için hizmet olarak oturum açma hakları kurmak için:

  1. secpol.msc çalıştırarak Yerel Güvenlik İlkesi düzenleyicisini açın.
  2. Yerel İlkeler düğümünü genişletin ve Kullanıcı Hakları Ataması'ı seçin.
  3. Hizmet olarak oturum aç ilkesi'i açın.
  4. Kullanıcı veya Grup Ekle'yi seçin.
  5. Aşağıdaki yaklaşımlardan birini kullanarak nesne adını (kullanıcı hesabı) girin:
    1. Nesne adı alanına kullanıcı hesabını ( {DOMAIN OR COMPUTER NAME\USER} ) yazın ve tamam'ı seçerek ilkeye kullanıcı ekleyin.
    2. Gelişmiş'i seçin. Şimdi Bul'a seçin. Listeden kullanıcı hesabını seçin. Tamam’ı seçin. İlkeye kullanıcı eklemek için Tekrar Tamam'ı seçin.
  6. Değişiklikleri kabul etmek için Tamam'ı veya Uygula'ya tıklayın.

Windows Service'i oluşturma ve yönetme

Hizmet oluşturma

Hizmeti kaydetmek için PowerShell komutlarını kullanın. Yönetimsel bir PowerShell 6 komut kabuğundan aşağıdaki komutları yürütün:

$acl = Get-Acl "{EXE PATH}"
$aclRuleArgs = "{DOMAIN OR COMPUTER NAME\USER}", "Read,Write,ReadAndExecute", "ContainerInherit,ObjectInherit", "None", "Allow"
$accessRule = New-Object System.Security.AccessControl.FileSystemAccessRule($aclRuleArgs)
$acl.SetAccessRule($accessRule)
$acl | Set-Acl "{EXE PATH}"

New-Service -Name {SERVICE NAME} -BinaryPathName "{EXE FILE PATH}" -Credential "{DOMAIN OR COMPUTER NAME\USER}" -Description "{DESCRIPTION}" -DisplayName "{DISPLAY NAME}" -StartupType Automatic
  • {EXE PATH}: Konakta uygulama klasörünün yolu (örneğin, d:\myservice ). Uygulamanın yürütülebilir dosyasını yola dahil etme. Sonda eğik çizgi gerekli değildir.
  • {DOMAIN OR COMPUTER NAME\USER}: Hizmet kullanıcı hesabı (örneğin, Contoso\ServiceUser ).
  • {SERVICE NAME}: Hizmet adı (örneğin, MyService ).
  • {EXE FILE PATH}: Uygulamanın yürütülebilir yolu (örneğin, d:\myservice\myservice.exe ). Yürütülebilir dosyanın adını uzantıyla birlikte girin.
  • {DESCRIPTION}: Hizmet açıklaması (örneğin, My sample service ).
  • {DISPLAY NAME}: Hizmet görünen adı (örneğin, My Service ).

Bir hizmet başlatın

Aşağıdaki PowerShell 6 komutuyla bir hizmeti başlatma:

Start-Service -Name {SERVICE NAME}

Komutun hizmeti başlatması birkaç saniye sürer.

Bir hizmetin durumunu belirleme

Bir hizmetin durumunu kontrol etmek için aşağıdaki PowerShell 6 komutunu kullanın:

Get-Service -Name {SERVICE NAME}

Durum aşağıdaki değerlerden biri olarak raporlandı:

  • Starting
  • Running
  • Stopping
  • Stopped

Bir hizmet durdurun

Aşağıdaki PowerShell 6 komutuyla bir hizmeti durdurun:

Stop-Service -Name {SERVICE NAME}

Hizmeti kaldırma

Bir hizmeti durdurmak için kısa bir gecikmeden sonra aşağıdaki PowerShell 6 komutuyla bir hizmeti kaldırın:

Remove-Service -Name {SERVICE NAME}

Proxy sunucusu ve yük dengeleyici senaryoları

İnternet'den veya kurumsal ağdan gelen isteklerle etkileşime olan ve bir ara sunucu veya yük dengeleyicinin arkasında yer alan hizmetler için ek yapılandırma gerekli olabilir. Daha fazla bilgi için bkz. Yapılandırma ASP.NET Core sunucuları ve yük dengeciler ile çalışacak şekilde yapılandırma.

Uç noktaları yapılandırma

varsayılan olarak, ASP.NET Core öğesine bağlanır http://localhost:5000 . Ortam değişkenini ayarlayarak URL 'YI ve bağlantı noktasını yapılandırın ASPNETCORE_URLS .

Ek URL ve bağlantı noktası yapılandırma yaklaşımları için ilgili sunucu makalesine bakın:

Yukarıdaki kılavuz, HTTPS uç noktaları için desteği içerir. örneğin, kimlik doğrulaması bir Windows hizmetiyle kullanıldığında HTTPS için uygulamayı yapılandırın.

Not

hizmet uç noktasının güvenliğini sağlamak için ASP.NET Core HTTPS geliştirme sertifikası kullanılması desteklenmez.

Geçerli dizin ve içerik kökü

bir Windows hizmeti için çağırarak döndürülen geçerli çalışma dizini GetCurrentDirectory C: \ Windows \ system32 klasörüdür. System32 klasörü, bir hizmetin dosyalarını (örneğin, ayarlar dosyaları) depolamak için uygun bir konum değildir. Bir hizmetin varlık ve ayar dosyalarını sürdürmek ve erişmek için aşağıdaki yaklaşımlardan birini kullanın.

ContentRootPath veya ContentRootFileProvider kullanın

Ihostenvironment. ContentRootPath kullanın veya ContentRootFileProvider bir uygulamanın kaynaklarını bulun.

Uygulama bir hizmet olarak çalıştırıldığında, UseWindowsService ContentRootPath AppContext. BaseDirectoryolarak ayarlanır.

Uygulamanın varsayılan ayar dosyaları appsettings.json ve appSettings. { '. JSON ortamı, konak oluşturma sırasında Createdefaultbuilder' ı çağırarak uygulamanın içerik kökünden yüklenir.

İçindeki geliştirici kodu tarafından yüklenen diğer ayar dosyaları için ConfigureAppConfiguration , çağrısına gerek yoktur SetBasePath . Aşağıdaki örnekte, custom_settings. JSON dosyası uygulamanın içerik kökünde bulunur ve açıkça bir temel yolu ayarlamadan yüklenir:

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .UseWindowsService()
            .ConfigureAppConfiguration((hostingContext, config) =>
            {
                config.AddJsonFile("custom_settings.json");
            })
            .ConfigureServices((hostContext, services) =>
            {
                services.AddHostedService<Worker>();
            });
}

bir GetCurrentDirectory Windows hizmeti uygulaması geçerli dizini olarak C: \ Windows \ system32 klasörünü döndürdüğünden kaynak yolunu almak için kullanmayı denemeyin.

Hizmetin dosyalarını diskte uygun bir konumda depolayın

SetBasePathDosyaları içeren klasöre kullanırken ile mutlak bir yol belirtin IConfigurationBuilder .

Sorun giderme

Windows hizmet uygulamasının sorunlarını gidermek için, bkz ASP.NET Core projelerinde sorun giderme ve hata ayıklama ..

Sık karşılaşılan hatalar

  • PowerShell 'in eski veya yayın öncesi sürümü kullanımda.
  • Kayıtlı hizmet, DotNet Publish komutundan uygulamanın yayımlanmış çıktısını kullanmaz. DotNet Build komutunun çıkışı, uygulama dağıtımı için desteklenmez. Yayımlanan varlıklar, dağıtım türüne bağlı olarak aşağıdaki klasörlerden birinde bulunur:
    • bin/Release/{Target Framework}/Publish (FDD)
    • bin/Release/{Target Framework}/{RUNTIME tanımlayıcısı}/Publish (SCD)
  • Hizmet çalışır durumda değil.
  • Uygulamanın kullandığı kaynakların yolları (örneğin, sertifikalar) yanlış. Windows bir hizmetin temel yolu c: \ Windows \ System32' dir.
  • Kullanıcı, hizmet hakları olarak oturum açma hakkına sahip değil.
  • PowerShell komutu çalıştırılırken kullanıcının parolasının kullanım dışı veya yanlış şekilde geçirilmesi New-Service .
  • uygulama ASP.NET Core kimlik doğrulaması gerektiriyor, ancak güvenli bağlantılar (HTTPS) için yapılandırılmamış.
  • İstek URL 'SI bağlantı noktası yanlış veya uygulamada doğru şekilde yapılandırılmamış.

Sistem ve uygulama olay günlükleri

Sistem ve uygulama olay günlüklerine erişin:

  1. Başlat menüsü açın, Olay Görüntüleyicisi arayın ve Olay Görüntüleyicisi uygulamayı seçin.
  2. Olay Görüntüleyicisi Windows günlükler düğümünü açın.
  3. Sistem olay günlüğünü açmak için sistem ' i seçin. Uygulama olay günlüğünü açmak için uygulama ' yı seçin.
  4. Hatalı uygulamayla ilişkili hataları arayın.

Uygulamayı komut isteminden çalıştırma

Birçok başlatma hatası olay günlüklerinde yararlı bilgiler oluşturmaz. Uygulamayı barındırma sisteminde bir komut isteminde çalıştırarak bazı hataların nedenini bulabilirsiniz. Uygulamadan ek ayrıntı günlüğe kaydetmek için, günlük düzeyini düşürün veya geliştirme ortamındauygulamayı çalıştırın.

Paket önbelleklerini temizle

Çalışan bir uygulama, geliştirme makinesindeki .NET Core SDK yükseltmeden veya uygulama içindeki paket sürümlerini değiştirirken hemen başarısız olabilir. Bazı durumlarda, önemli paketler ana yükseltmeler gerçekleştirirken bir uygulamayı bozabilir. Bu sorunların çoğu aşağıdaki yönergeleri izleyerek düzeltilebilir:

  1. Bin ve obj klasörlerini silin.

  2. Bir komut kabuğundan DotNet NuGet yerelleri, Tümünü Temizle ' i yürüterek paket önbelleklerini temizleyin.

    Paket önbelleklerini Temizleme, nuget.exe aracı ile de gerçekleştirilebilir ve komutu yürütülebilir nuget locals all -clear . nuget.exe , Windows masaüstü işletim sistemiyle paketlenmiş bir yüklemedir ve NuGet web sitesindenayrı olarak alınmalıdır.

  3. Projeyi geri yükleyin ve yeniden derleyin.

  4. Uygulamayı yeniden dağıtmadan önce sunucusundaki dağıtım klasöründeki tüm dosyaları silin.

Yavaş veya yanıt vermeyen uygulama

Kilitlenme dökümü , sistem belleğinin bir anlık görüntüsüdür ve uygulama kilitlenmesinin, başlatma hatasının veya yavaş uygulamanın nedenini belirlemenize yardımcı olabilir.

Uygulama kilitleniyor veya bir özel durumla karşılaşırsa

Windows Hata Bildirimi bir döküm edinin ve çözümleyin (WER):

  1. Kilitlenme dökümü dosyalarını tutmak için bir klasör oluşturun c:\dumps .

  2. Enabledökümler PowerShell betiğini uygulama yürütülebilir adıyla çalıştırın:

    .\EnableDumps {APPLICATION EXE} c:\dumps
    
  3. Uygulamayı kilitlenmenin oluşmasına neden olan koşullar altında çalıştırın.

  4. Kilitlenme gerçekleştirildikten sonra, Disabledökümler PowerShell betiğiniçalıştırın:

    .\DisableDumps {APPLICATION EXE}
    

Uygulama kilitlenmeleri ve döküm koleksiyonu tamamlandıktan sonra, uygulamanın normal olarak sonlandırılmasına izin verilir. PowerShell betiği, WER 'i uygulama başına en fazla beş döküm toplayacak şekilde yapılandırır.

Uyarı

Kilitlenme dökümleri büyük miktarda disk alanı kaplar (her birine kadar çok gigabayt kadar).

Uygulama yanıt vermiyor, başlatma sırasında başarısız oluyor veya normal şekilde çalışıyor

Bir uygulama askıda kaldığında (yanıt vermeyi keser ancak kilitlenmez), başlatma sırasında başarısız olur veya normal şekilde çalışır. Kullanıcı modu döküm dosyaları: döküm oluşturmak için uygun bir aracı seçmek üzere en iyi aracı seçme.

Dökümü çözümle

Bir döküm çeşitli yaklaşımlar kullanılarak analiz edilebilir. Daha fazla bilgi için bkz. User-Mode döküm dosyasını çözümleme.

Ek kaynaklar

ASP.NET Core bir uygulama, ııs kullanmadan Windows Windows hizmeti olarak barındırılabilir. Windows bir hizmet olarak barındırıldığında, uygulama otomatik olarak sunucu yeniden başlatıldıktan sonra başlatılır.

Örnek kodu görüntüleme veya indirme (nasıl indirileceği)

Önkoşullar

Uygulama yapılandırması

Uygulama Microsoft. AspNetCore. Hosting. WindowsServices ve Microsoft. Extensions. Logging. EventLogiçin paket başvuruları gerektirir.

Bir hizmetin dışında çalışırken test ve hata ayıklamak için, uygulamanın bir hizmet olarak mı yoksa bir konsol uygulaması mi çalıştığını belirleme kodu ekleyin. Hata ayıklayıcının ekli olduğunu veya bir anahtarın mevcut olup olmadığını denetleyin --console . Her iki koşul de geçerliyse (uygulama bir hizmet olarak çalıştırılmadıysa), çağırın Run . Koşullar yanlışsa (uygulama bir hizmet olarak çalıştırılır):

  • SetCurrentDirectoryUygulamanın yayımlanmış konumunun yolunu çağırın ve kullanın. GetCurrentDirectorybir Windows hizmet uygulaması çağrıldığında C: \ Windows \ system32 klasörünü döndürdüğünden yolu almak için çağırmayın GetCurrentDirectory . Daha fazla bilgi için geçerli dizin ve içerik kökü bölümüne bakın. Bu adım, uygulamanın ' de yapılandırılmadan önce gerçekleştirilir CreateWebHostBuilder .
  • RunAsServiceUygulamayı bir hizmet olarak çalıştırmak için çağırın.

Komut satırı yapılandırma sağlayıcısı komut satırı bağımsız değişkenleri için ad-değer çiftleri gerektirdiğinden, --console bağımsız değişkenleri almadan önce anahtar bağımsız değişkenlerden kaldırılır CreateDefaultBuilder .

Windows olay günlüğüne yazmak için EventLog sağlayıcısını öğesine ekleyin ConfigureLogging . Günlük kaydı düzeyini Logging:LogLevel:Default appSettings içindeki anahtarla ayarlayın . Production. JSON dosyası.

Örnek uygulamadan aşağıdaki örnekte, RunAsCustomService RunAsService uygulama içindeki ömür olaylarını işlemek için yerine çağrılır. Daha fazla bilgi için olayları başlatma ve durdurma olaylarını inceleyin bölümüne bakın.

public class Program
{
    public static void Main(string[] args)
    {
        var isService = !(Debugger.IsAttached || args.Contains("--console"));
        
        if (isService)
        {
            var pathToExe = Process.GetCurrentProcess().MainModule.FileName;
            var pathToContentRoot = Path.GetDirectoryName(pathToExe);
            Directory.SetCurrentDirectory(pathToContentRoot);
        }

        var builder = CreateWebHostBuilder(
            args.Where(arg => arg != "--console").ToArray());

        var host = builder.Build();

        if (isService)
        {
            // To run the app without the CustomWebHostService change the
            // next line to host.RunAsService();
            host.RunAsCustomService();
        }
        else
        {
            host.Run();
        }
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .ConfigureLogging((hostingContext, logging) =>
            {
                logging.AddEventLog();
            })
            .ConfigureAppConfiguration((context, config) =>
            {
                // Configure the app here.
            })
            .UseStartup<Startup>();
}

Dağıtım türü

Dağıtım senaryoları hakkında bilgi ve öneriler için bkz. .NET Core uygulama dağıtımı.

SDK

Sayfaları veya MVC çerçevelerini kullanan bir Web uygulaması tabanlı hizmet için Razor , proje dosyasında Web SDK 'sını belirtin:

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

Hizmet yalnızca arka plan görevlerini (örneğin, barındırılan hizmetler) yürütülüyorsa, proje dosyasında çalışan SDK 'sını belirtin:

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

Çerçeveye bağımlı dağıtım (FDD)

Çerçeveye bağımlı dağıtım (FDD), hedef sistemde .NET Core 'un paylaşılan sistem genelindeki bir sürümünün varlığına dayanır. Bu makaledeki kılavuzdan sonra FDD senaryosu benimsendiği zaman SDK, çerçeveye bağlı yürütülebilir dosya olarak adlandırılan yürütülebilir bir dosya (.exe) oluşturur.

Windows çalışma zamanı tanımlayıcısı (rıd) ( <RuntimeIdentifier> ) hedef framework 'ü içerir. Aşağıdaki örnekte, RID olarak ayarlanır win7-x64 . <SelfContained> özelliği false olarak ayarlanmıştır. bu özellikler SDK 'nın Windows için bir yürütülebilir (.exe) dosya ve paylaşılan .net Core çerçevesine bağlı bir uygulama oluşturmasını ister.

bir ASP.NET Core uygulaması yayımlandığında normalde oluşturulan web.config dosyası, Windows Services uygulaması için gereksizdir. web.config dosyasının oluşturulmasını devre dışı bırakmak için, <IsTransformWebConfigDisabled> özelliği öğesine ekleyin true .

<PropertyGroup>
  <TargetFramework>netcoreapp2.2</TargetFramework>
  <RuntimeIdentifier>win7-x64</RuntimeIdentifier>
  <SelfContained>false</SelfContained>
  <IsTransformWebConfigDisabled>true</IsTransformWebConfigDisabled>
</PropertyGroup>

Kendi içinde dağıtım (SCD)

Kendinden bağımsız dağıtım (SCD), ana bilgisayar sisteminde paylaşılan bir Framework varlığına güvenmez. Çalışma zamanı ve uygulamanın bağımlılıkları uygulamayla birlikte dağıtılır.

hedef framework 'ü içeren bir Windows çalışma zamanı tanımlayıcısı (rıd) vardır <PropertyGroup> :

<RuntimeIdentifier>win7-x64</RuntimeIdentifier>

Birden çok RID için yayımlamak için:

  • RID 'leri, noktalı virgülle ayrılmış bir liste olarak belirtin.
  • Özellik adını <RuntimeIdentifiers> (plural) kullanın.

Daha fazla bilgi için bkz. .NET Core RID kataloğu.

Bir <SelfContained> özellik şu şekilde ayarlanır true :

<SelfContained>true</SelfContained>

Hizmet Kullanıcı hesabı

Bir hizmet için Kullanıcı hesabı oluşturmak için, bir yönetim PowerShell 6 komut kabuğundan New-LocalUser cmdlet 'ini kullanın.

Windows 10 Ekim 2018 Güncelleştirmesi (sürüm 1809/build 10.0.17763) veya sonraki sürümlerde:

New-LocalUser -Name {SERVICE NAME}

Windows işletim sisteminde Windows 10 Ekim 2018 Güncelleştirmesi daha önce (sürüm 1809/build 10.0.17763):

powershell -Command "New-LocalUser -Name {SERVICE NAME}"

İstendiğinde güçlü bir parola sağlayın.

-AccountExpiresParametresi New-LocalUser cmdlet 'ine bir süre sonu ile sağlanmamışsa DateTime hesabın süresi dolmaz.

Daha fazla bilgi için bkz. Microsoft. PowerShell. LocalAccounts ve hizmet Kullanıcı hesapları.

Active Directory kullanırken kullanıcıları yönetmeye yönelik alternatif bir yaklaşım, yönetilen hizmet hesaplarını kullanmaktır. Daha fazla bilgi için bkz. Grup yönetilen hizmet hesaplarına genel bakış.

Hizmet hakları olarak oturum açma

Hizmet Kullanıcı hesabı için hizmet hakları olarak oturum açma oluşturmak için:

  1. Yerel Güvenlik Ilkesi düzenleyicisini, secpol. msc' i çalıştırarak açın.
  2. Yerel ilkeler düğümünü genişletin ve Kullanıcı hakları ataması' nı seçin.
  3. Hizmet olarak oturum açma ilkesi açın.
  4. Kullanıcı veya Grup Ekle' yi seçin.
  5. Aşağıdaki yaklaşımlardan birini kullanarak nesne adını (Kullanıcı hesabı) sağlayın:
    1. Kullanıcı hesabını ( {DOMAIN OR COMPUTER NAME\USER} ) nesne adı alanına yazın ve kullanıcıyı ilkeye eklemek Için Tamam ' ı seçin.
    2. Gelişmiş'i seçin. Şimdi bul' u seçin. Listeden Kullanıcı hesabını seçin. Tamam’ı seçin. Kullanıcıyı ilkeye eklemek için yeniden Tamam ' ı seçin.
  6. Değişiklikleri kabul etmek için Tamam ' ı veya Uygula ' yı seçin.

Windows hizmetini oluşturma ve yönetme

Hizmet oluşturma

Bir hizmeti kaydetmek için PowerShell komutlarını kullanın. Bir yönetim PowerShell 6 komut kabuğundan aşağıdaki komutları yürütün:

$acl = Get-Acl "{EXE PATH}"
$aclRuleArgs = {DOMAIN OR COMPUTER NAME\USER}, "Read,Write,ReadAndExecute", "ContainerInherit,ObjectInherit", "None", "Allow"
$accessRule = New-Object System.Security.AccessControl.FileSystemAccessRule($aclRuleArgs)
$acl.SetAccessRule($accessRule)
$acl | Set-Acl "{EXE PATH}"

New-Service -Name {SERVICE NAME} -BinaryPathName {EXE FILE PATH} -Credential {DOMAIN OR COMPUTER NAME\USER} -Description "{DESCRIPTION}" -DisplayName "{DISPLAY NAME}" -StartupType Automatic
  • {EXE PATH}: Konaktaki uygulamanın klasörünün yolu (örneğin, d:\myservice ). Uygulamanın yürütülebilir dosyasını yola eklemeyin. Sondaki eğik çizgi gerekli değildir.
  • {DOMAIN OR COMPUTER NAME\USER}: Hizmet Kullanıcı hesabı (örneğin, Contoso\ServiceUser ).
  • {SERVICE NAME}: Hizmet adı (örneğin, MyService ).
  • {EXE FILE PATH}: Uygulamanın yürütülebilir yolu (örneğin, d:\myservice\myservice.exe ). Yürütülebilir dosyanın dosya adını uzantısına ekleyin.
  • {DESCRIPTION}: Hizmet açıklaması (örneğin, My sample service ).
  • {DISPLAY NAME}: Hizmet görünen adı (örneğin, My Service ).

Bir hizmet başlatın

Aşağıdaki PowerShell 6 komutuyla bir hizmet başlatın:

Start-Service -Name {SERVICE NAME}

Komutun başlatılması birkaç saniye sürer.

Hizmetin durumunu belirleme

Bir hizmetin durumunu denetlemek için aşağıdaki PowerShell 6 komutunu kullanın:

Get-Service -Name {SERVICE NAME}

Durum, aşağıdaki değerlerden biri olarak bildirilir:

  • Starting
  • Running
  • Stopping
  • Stopped

Bir hizmet durdurun

Aşağıdaki PowerShell 6 komutuyla bir hizmeti durdurun:

Stop-Service -Name {SERVICE NAME}

Hizmeti Kaldır

Bir hizmeti durdurmak için kısa bir gecikmeden sonra, aşağıdaki PowerShell 6 komutuyla bir hizmeti kaldırın:

Remove-Service -Name {SERVICE NAME}

Olayları başlatma ve durdurma olaylarını işleme

OnStarting, OnStarted Ve olaylarını işlemek için OnStopping :

  1. WebHostService OnStarting , OnStarted Ve yöntemleriyle türetilen bir sınıf oluşturun OnStopping :

    [DesignerCategory("Code")]
    internal class CustomWebHostService : WebHostService
    {
        private ILogger _logger;
    
        public CustomWebHostService(IWebHost host) : base(host)
        {
            _logger = host.Services
                .GetRequiredService<ILogger<CustomWebHostService>>();
        }
    
        protected override void OnStarting(string[] args)
        {
            _logger.LogInformation("OnStarting method called.");
            base.OnStarting(args);
        }
    
        protected override void OnStarted()
        {
            _logger.LogInformation("OnStarted method called.");
            base.OnStarted();
        }
    
        protected override void OnStopping()
        {
            _logger.LogInformation("OnStopping method called.");
            base.OnStopping();
        }
    }
    
  2. ' A geçişi için bir genişletme yöntemi oluşturun IWebHost CustomWebHostService Run :

    public static class WebHostServiceExtensions
    {
        public static void RunAsCustomService(this IWebHost host)
        {
            var webHostService = new CustomWebHostService(host);
            ServiceBase.Run(webHostService);
        }
    }
    
  3. İçinde Program.Main , RunAsCustomService yerine genişletme yöntemini çağırın RunAsService :

    host.RunAsCustomService();
    

    Konumunu görmek için RunAsService Program.Main , dağıtım türü bölümünde gösterilen kod örneğine bakın.

Proxy sunucusu ve yük dengeleyici senaryoları

Internet 'ten veya şirket ağından gelen isteklerle etkileşime geçen ve bir ara sunucu veya yük dengeleyicinin arkasındaki Hizmetler ek yapılandırma gerektirebilir. Daha fazla bilgi için bkz. Yapılandırma ASP.NET Core sunucuları ve yük dengeciler ile çalışacak şekilde yapılandırma.

Uç noktaları yapılandırma

varsayılan olarak, ASP.NET Core öğesine bağlanır http://localhost:5000 . Ortam değişkenini ayarlayarak URL 'YI ve bağlantı noktasını yapılandırın ASPNETCORE_URLS .

Ek URL ve bağlantı noktası yapılandırma yaklaşımları için ilgili sunucu makalesine bakın:

Yukarıdaki kılavuz, HTTPS uç noktaları için desteği içerir. örneğin, kimlik doğrulaması bir Windows hizmetiyle kullanıldığında HTTPS için uygulamayı yapılandırın.

Not

hizmet uç noktasının güvenliğini sağlamak için ASP.NET Core HTTPS geliştirme sertifikası kullanılması desteklenmez.

Geçerli dizin ve içerik kökü

bir Windows hizmeti için çağırarak döndürülen geçerli çalışma dizini GetCurrentDirectory C: \ Windows \ system32 klasörüdür. System32 klasörü, bir hizmetin dosyalarını (örneğin, ayarlar dosyaları) depolamak için uygun bir konum değildir. Bir hizmetin varlık ve ayar dosyalarını sürdürmek ve erişmek için aşağıdaki yaklaşımlardan birini kullanın.

Uygulamanın klasörü için içerik kök yolunu ayarla

, ContentRootPath binPath Bir hizmet oluşturulduğunda bağımsız değişkene aynı yol olarak sağlanır. GetCurrentDirectoryAyarlar dosyalarına yollar oluşturmak için çağırmak yerine, SetCurrentDirectory uygulamanın içerik kökününyolunu çağırın.

İçinde Program.Main , hizmetin yürütülebilir dosyasının yolunu belirleyin ve uygulamanın içerik kökünü oluşturmak için yolu kullanın:

var pathToExe = Process.GetCurrentProcess().MainModule.FileName;
var pathToContentRoot = Path.GetDirectoryName(pathToExe);
Directory.SetCurrentDirectory(pathToContentRoot);

CreateWebHostBuilder(args)
    .Build()
    .RunAsService();

Hizmetin dosyalarını diskte uygun bir konumda depolayın

SetBasePathDosyaları içeren klasöre kullanırken ile mutlak bir yol belirtin IConfigurationBuilder .

Sorun giderme

Windows hizmet uygulamasının sorunlarını gidermek için, bkz ASP.NET Core projelerinde sorun giderme ve hata ayıklama ..

Sık karşılaşılan hatalar

  • PowerShell 'in eski veya yayın öncesi sürümü kullanımda.
  • Kayıtlı hizmet, DotNet Publish komutundan uygulamanın yayımlanmış çıktısını kullanmaz. DotNet Build komutunun çıkışı, uygulama dağıtımı için desteklenmez. Yayımlanan varlıklar, dağıtım türüne bağlı olarak aşağıdaki klasörlerden birinde bulunur:
    • bin/Release/{Target Framework}/Publish (FDD)
    • bin/Release/{TARGET FRAMEWORK}/{RUNTIME IDENTIFIER}/publish (SCD)
  • Hizmet ÇALıŞıYOR durumda değil.
  • Uygulamanın kullandığı kaynakların yolları (örneğin, sertifikalar) yanlış. Windows Service'in temel yolu c: \ Windows \ System32'dir.
  • Kullanıcının hizmet olarak oturum açma hakları yok.
  • PowerShell komutu yürüttürken kullanıcının parolasının süresi doldu veya hatalı New-Service bir şekilde geçirildi.
  • Uygulama, ASP.NET Core kimlik doğrulaması gerektirir, ancak güvenli bağlantılar (HTTPS) için yapılandırılmaz.
  • İstek URL'si bağlantı noktası yanlış veya uygulamada doğru yapılandırılmamış.

Sistem ve Uygulama Olay Günlükleri

Sistem ve Uygulama Olay Günlüklerine erişin:

  1. Başlat menüsü açın, Olay Görüntüleyicisi için arama Olay Görüntüleyicisi seçin.
  2. Bu Olay Görüntüleyicisi Günlükler düğümünü Windows açın.
  3. Sistem Olay Günlüğü'lerini açmak için Sistem'i seçin. Uygulama'ya seçerek Uygulama Olay Günlüğü'lerini açın.
  4. Başarısız uygulamayla ilişkili hataları arama.

Uygulamayı komut isteminde çalıştırma

Birçok başlatma hatası, olay günlüklerinde yararlı bilgiler üretmez. Barındırma sisteminde bir komut isteminde uygulamayı çalıştırarak bazı hataların nedenini bulabilirsiniz. Uygulamanın ek ayrıntılarını günlüğe kaydedilirken günlük düzeyini düşürebilirsiniz veya uygulamayı Geliştirme ortamında çalıştırın.

Paket önbelleklerini temizleme

İşleve sahip bir uygulama, geliştirme makinesine .NET Core SDK veya uygulamanın içindeki paket sürümlerini değiştirdikten hemen sonra başarısız olabilir. Bazı durumlarda, büyük yükseltmeler yaparken tutarlı paketler bir uygulamayı bozabilirsiniz. Bu sorunların çoğu şu yönergelere uyularak düzeltilmiştir:

  1. Bin ve obj klasörlerini silin.

  2. dotnet nuget locals komutunu yürüterek paket önbelleklerini temizleyin ;komut kabuğundan temizleyin.

    Paket önbelleklerini temizleme,nuget.exe aracıyla ve komutu yürüterek de gerçek nuget locals all -clear olabilir. nuget.exe, Windows masaüstü işletim sistemiyle birlikte paketlenmiş bir yükleme değildir ve NuGet web sitesinden ayrı olarak alınmalıdır.

  3. Projeyi geri yükleme ve yeniden oluşturma.

  4. Uygulamayı yeniden dağıtmadan önce sunucu üzerinde dağıtım klasöründeki tüm dosyaları silin.

Yavaş veya yanıt vermiyor uygulaması

Kilitlenme bilgi dökümü, sistem belleğinin anlık görüntüsü olup uygulama kilitlenmesi, başlatma hatası veya yavaş uygulamanın nedenini belirlemeye yardımcı olabilir.

Uygulama kilitleniyor veya özel durumla karşılaşıyor

Windows Hata Bildirimi (WER) ile döküm alma ve analiz etme:

  1. 'de kilitlenme dökümü dosyalarını tutmak için bir klasör c:\dumps oluşturun.

  2. EnableDumps PowerShell betiği uygulama yürütülebilir adıyla çalıştırın:

    .\EnableDumps {APPLICATION EXE} c:\dumps
    
  3. Uygulamayı kilitlenmeye neden olan koşullar altında çalıştırın.

  4. Kilitlenme gerçekleştikten sonra DisableDumps PowerShell betiği çalıştırın:

    .\DisableDumps {APPLICATION EXE}
    

Uygulama kilitleniyor ve döküm toplama işlemi tamamlandıktan sonra uygulamanın normal şekilde sonlandırılmalarına izin verilir. PowerShell betiği, WER'yi uygulama başına en fazla beş döküm topacak şekilde yapılandırıyor.

Uyarı

Kilitlenme dökümleri büyük miktarda disk alanı (her biri birkaç gigabayta kadar) kaplar.

Uygulama yanıt vermiyor, başlatma sırasında başarısız oluyor veya normal çalışıyor

Uygulama yanıt vermese de yanıt vermese de kilitlenmezse, başlatma sırasında başarısız olursa veya normal şekilde çalıştırılacaksa bkz. Kullanıcı Modu Döküm Dosyaları: Döküm üretmek için uygun bir araç seçmek için En İyi Aracı Seçme.

Döküm analizi

Döküm, çeşitli yaklaşımlar kullanılarak analiz edilir. Daha fazla bilgi için, bkz. User-Mode Döküm Dosyası Çözümleme.

Ek kaynaklar

Bir ASP.NET Core uygulama, IIS Windows Windows hizmet olarak barındırabilirsiniz. Windows Hizmeti olarak barındırılırsa, sunucu yeniden başlatıldıktan sonra uygulama otomatik olarak başlatılır.

Örnek kodu görüntüleme veya indirme ( nasılindir)

Önkoşullar

Uygulama yapılandırması

Uygulama, Microsoft.AspNetCore.Hosting.WindowsServices ve Microsoft.Extensions.Logging.EventLogiçin paket başvuruları gerektirir.

Bir hizmetin dışında çalıştırarak test etmek ve hata ayıklamak için, uygulamanın hizmet olarak mı yoksa konsol uygulaması olarak mı çalıştırı olduğunu belirlemek için kod ekleyin. Hata ayıklayıcının ekli olup olduğunu veya bir --console anahtarın mevcut olup olduğunu inceler. İki koşuldan biri true ise (uygulama hizmet olarak çalıştırnmıyorsa) çağrısında Run bulundurabilirsiniz. Koşullar false ise (uygulama hizmet olarak çalıştır):

  • Uygulamayı SetCurrentDirectory arayın ve uygulamanın yayımlanmış konumunun yolunu kullanın. Bir Windows Service uygulaması çağrıldıklarında GetCurrentDirectory C: \ WINDOWS \ system32 klasörünü döndür olduğundan yolu almak için GetCurrentDirectory çağrıyın. Daha fazla bilgi için Geçerli dizin ve içerik kökü bölümüne bakın. Bu adım, uygulama içinde yapılandırılmadan önce CreateWebHostBuilder gerçekleştirilir.
  • Uygulamayı RunAsService hizmet olarak çalıştırmak için çağrısı.

Komut Satırı Yapılandırma Sağlayıcısı, komut satırı bağımsız değişkenleri için ad-değer çiftleri gerektirdiğinden, anahtar bağımsız değişkenleri alamadan önce bağımsız --console CreateDefaultBuilder değişkenlerden kaldırılır.

Olay Günlüğü'Windows yazmak için EventLog sağlayıcısını dosyasına ConfigureLogging ekleyin. Günlüğe kaydetme düzeyini Logging:LogLevel:Default appsettings anahtarıyla ayarlayın. Production.json dosyası.

Örnek uygulamanın aşağıdaki örneğinde, uygulama RunAsCustomService içindeki yaşam süresi RunAsService olaylarını işlemek için yerine çağrılır. Daha fazla bilgi için Başlangıç ve durdurma olaylarını işleme bölümüne bakın.

public class Program
{
    public static void Main(string[] args)
    {
        var isService = !(Debugger.IsAttached || args.Contains("--console"));
        
        if (isService)
        {
            var pathToExe = Process.GetCurrentProcess().MainModule.FileName;
            var pathToContentRoot = Path.GetDirectoryName(pathToExe);
            Directory.SetCurrentDirectory(pathToContentRoot);
        }

        var builder = CreateWebHostBuilder(
            args.Where(arg => arg != "--console").ToArray());

        var host = builder.Build();

        if (isService)
        {
            // To run the app without the CustomWebHostService change the
            // next line to host.RunAsService();
            host.RunAsCustomService();
        }
        else
        {
            host.Run();
        }
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .ConfigureLogging((hostingContext, logging) =>
            {
                logging.AddEventLog();
            })
            .ConfigureAppConfiguration((context, config) =>
            {
                // Configure the app here.
            })
            .UseStartup<Startup>();
}

Dağıtım türü

Dağıtım senaryoları hakkında bilgi ve öneriler için bkz. .NET Core uygulama dağıtımı.

SDK

Sayfalar veya MVC çerçevelerini kullanan web uygulaması tabanlı bir hizmet için proje dosyasında Razor Web SDK'sini belirtin:

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

Hizmet yalnızca arka plan görevlerini yürütürse (örneğin, barındırılan hizmetler),proje dosyasında Çalışan SDK'sı belirtin:

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

Çerçeveye bağımlı dağıtım (FDD)

Çerçeveye bağımlı dağıtım (FDD), hedef sistemde paylaşılan sistem genelinde .NET Core sürümünün varlığına bağlıdır. Bu makaledeki kılavuza göre FDD senaryosu benimsenmiş olduğunda SDK, çerçeveye bağımlı yürütülebilir dosya olarak adlandırılan bir yürütülebilir dosya (.exe) üretir.

Windows Çalışma Zamanı Tanımlayıcısı (RID) ( <RuntimeIdentifier> ) hedef çerçeveyi içerir. Aşağıdaki örnekte RID olarak win7-x64 ayarlanmış. <SelfContained> özelliği false olarak ayarlanmıştır. Bu özellikler SDK'ya Windows .NET Core çerçevesine bağlı bir uygulama için yürütülebilir (.exe) dosyası oluşturma talimatı sağlar.

<UseAppHost> özelliği true olarak ayarlanmıştır. Bu özellik, hizmete FDD için bir etkinleştirme yolu (yürütülebilir, .exe) sağlar.

Normalde web.config bir uygulama yayımlarken üretilen bir ASP.NET Core dosyası, Windows Services uygulaması için gereksizdir. Dosyanın oluşturulmasını devre web.config için, olarak ayarlanmış <IsTransformWebConfigDisabled> özelliğini true ekleyin.

<PropertyGroup>
  <TargetFramework>netcoreapp2.2</TargetFramework>
  <RuntimeIdentifier>win7-x64</RuntimeIdentifier>
  <UseAppHost>true</UseAppHost>
  <SelfContained>false</SelfContained>
  <IsTransformWebConfigDisabled>true</IsTransformWebConfigDisabled>
</PropertyGroup>

Kendi içinde dağıtım (SCD)

Kendi içinde dağıtım (SCD), konak sistemde paylaşılan bir çerçevenin varlığına güvenmez. Çalışma zamanı ve uygulamanın bağımlılıkları uygulamayla birlikte dağıtılır.

Hedef Windows içeren çalışma zamanı tanımlayıcısı (RID) dahil <PropertyGroup> edilir:

<RuntimeIdentifier>win7-x64</RuntimeIdentifier>

Birden çok RI'ye yayımlamak için:

  • NOKTALı virgülle ayrılmış bir listede RID'leri sağlar.
  • Özellik adını <RuntimeIdentifiers> (çoğul) kullanın.

Daha fazla bilgi için bkz. .NET Core RID Kataloğu.

Bir <SelfContained> özellik olarak true ayarlanır:

<SelfContained>true</SelfContained>

Hizmet kullanıcı hesabı

Bir hizmet için kullanıcı hesabı oluşturmak üzere, yönetimsel bir PowerShell 6 komut kabuğundan New-LocalUser cmdlet'ini kullanın.

Windows 10 Ekim 2018 Güncelleştirmesi (sürüm 1809/build 10.0.17763) veya sonraki sürümler:

New-LocalUser -Name {SERVICE NAME}

Windows önceki işletim sistemi Windows 10 Ekim 2018 Güncelleştirmesi (sürüm 1809/derleme 10.0.17763):

powershell -Command "New-LocalUser -Name {SERVICE NAME}"

İstendiğinde güçlü bir parola girin.

-AccountExpires New-LocalUser cmdlet'ine süre sonu ile parametresi sağlanmadısa, DateTime hesabın süresi dolmaz.

Daha fazla bilgi için bkz. Microsoft. PowerShell. LocalAccounts ve hizmet Kullanıcı hesapları.

Active Directory kullanırken kullanıcıları yönetmeye yönelik alternatif bir yaklaşım, yönetilen hizmet hesaplarını kullanmaktır. Daha fazla bilgi için bkz. Grup yönetilen hizmet hesaplarına genel bakış.

Hizmet hakları olarak oturum açma

Hizmet Kullanıcı hesabı için hizmet hakları olarak oturum açma oluşturmak için:

  1. Yerel Güvenlik Ilkesi düzenleyicisini, secpol. msc' i çalıştırarak açın.
  2. Yerel ilkeler düğümünü genişletin ve Kullanıcı hakları ataması' nı seçin.
  3. Hizmet olarak oturum açma ilkesi açın.
  4. Kullanıcı veya Grup Ekle' yi seçin.
  5. Aşağıdaki yaklaşımlardan birini kullanarak nesne adını (Kullanıcı hesabı) sağlayın:
    1. Kullanıcı hesabını ( {DOMAIN OR COMPUTER NAME\USER} ) nesne adı alanına yazın ve kullanıcıyı ilkeye eklemek Için Tamam ' ı seçin.
    2. Gelişmiş'i seçin. Şimdi bul' u seçin. Listeden Kullanıcı hesabını seçin. Tamam’ı seçin. Kullanıcıyı ilkeye eklemek için yeniden Tamam ' ı seçin.
  6. Değişiklikleri kabul etmek için Tamam ' ı veya Uygula ' yı seçin.

Windows hizmetini oluşturma ve yönetme

Hizmet oluşturma

Bir hizmeti kaydetmek için PowerShell komutlarını kullanın. Bir yönetim PowerShell 6 komut kabuğundan aşağıdaki komutları yürütün:

$acl = Get-Acl "{EXE PATH}"
$aclRuleArgs = {DOMAIN OR COMPUTER NAME\USER}, "Read,Write,ReadAndExecute", "ContainerInherit,ObjectInherit", "None", "Allow"
$accessRule = New-Object System.Security.AccessControl.FileSystemAccessRule($aclRuleArgs)
$acl.SetAccessRule($accessRule)
$acl | Set-Acl "{EXE PATH}"

New-Service -Name {SERVICE NAME} -BinaryPathName {EXE FILE PATH} -Credential {DOMAIN OR COMPUTER NAME\USER} -Description "{DESCRIPTION}" -DisplayName "{DISPLAY NAME}" -StartupType Automatic
  • {EXE PATH}: Konaktaki uygulamanın klasörünün yolu (örneğin, d:\myservice ). Uygulamanın yürütülebilir dosyasını yola eklemeyin. Sondaki eğik çizgi gerekli değildir.
  • {DOMAIN OR COMPUTER NAME\USER}: Hizmet Kullanıcı hesabı (örneğin, Contoso\ServiceUser ).
  • {SERVICE NAME}: Hizmet adı (örneğin, MyService ).
  • {EXE FILE PATH}: Uygulamanın yürütülebilir yolu (örneğin, d:\myservice\myservice.exe ). Yürütülebilir dosyanın dosya adını uzantısına ekleyin.
  • {DESCRIPTION}: Hizmet açıklaması (örneğin, My sample service ).
  • {DISPLAY NAME}: Hizmet görünen adı (örneğin, My Service ).

Bir hizmet başlatın

Aşağıdaki PowerShell 6 komutuyla bir hizmet başlatın:

Start-Service -Name {SERVICE NAME}

Komutun başlatılması birkaç saniye sürer.

Hizmetin durumunu belirleme

Bir hizmetin durumunu denetlemek için aşağıdaki PowerShell 6 komutunu kullanın:

Get-Service -Name {SERVICE NAME}

Durum, aşağıdaki değerlerden biri olarak bildirilir:

  • Starting
  • Running
  • Stopping
  • Stopped

Bir hizmet durdurun

Aşağıdaki PowerShell 6 komutuyla bir hizmeti durdurun:

Stop-Service -Name {SERVICE NAME}

Hizmeti Kaldır

Bir hizmeti durdurmak için kısa bir gecikmeden sonra, aşağıdaki PowerShell 6 komutuyla bir hizmeti kaldırın:

Remove-Service -Name {SERVICE NAME}

Olayları başlatma ve durdurma olaylarını işleme

OnStarting, OnStarted Ve olaylarını işlemek için OnStopping :

  1. WebHostService OnStarting , OnStarted Ve yöntemleriyle türetilen bir sınıf oluşturun OnStopping :

    [DesignerCategory("Code")]
    internal class CustomWebHostService : WebHostService
    {
        private ILogger _logger;
    
        public CustomWebHostService(IWebHost host) : base(host)
        {
            _logger = host.Services
                .GetRequiredService<ILogger<CustomWebHostService>>();
        }
    
        protected override void OnStarting(string[] args)
        {
            _logger.LogInformation("OnStarting method called.");
            base.OnStarting(args);
        }
    
        protected override void OnStarted()
        {
            _logger.LogInformation("OnStarted method called.");
            base.OnStarted();
        }
    
        protected override void OnStopping()
        {
            _logger.LogInformation("OnStopping method called.");
            base.OnStopping();
        }
    }
    
  2. ' A geçişi için bir genişletme yöntemi oluşturun IWebHost CustomWebHostService Run :

    public static class WebHostServiceExtensions
    {
        public static void RunAsCustomService(this IWebHost host)
        {
            var webHostService = new CustomWebHostService(host);
            ServiceBase.Run(webHostService);
        }
    }
    
  3. İçinde Program.Main , RunAsCustomService yerine genişletme yöntemini çağırın RunAsService :

    host.RunAsCustomService();
    

    Konumunu görmek için RunAsService Program.Main , dağıtım türü bölümünde gösterilen kod örneğine bakın.

Proxy sunucusu ve yük dengeleyici senaryoları

Internet 'ten veya şirket ağından gelen isteklerle etkileşime geçen ve bir ara sunucu veya yük dengeleyicinin arkasındaki Hizmetler ek yapılandırma gerektirebilir. Daha fazla bilgi için bkz. Yapılandırma ASP.NET Core sunucuları ve yük dengeciler ile çalışacak şekilde yapılandırma.

Uç noktaları yapılandırma

varsayılan olarak, ASP.NET Core öğesine bağlanır http://localhost:5000 . Ortam değişkenini ayarlayarak URL 'YI ve bağlantı noktasını yapılandırın ASPNETCORE_URLS .

Ek URL ve bağlantı noktası yapılandırma yaklaşımları için ilgili sunucu makalesine bakın:

Yukarıdaki kılavuz, HTTPS uç noktaları için desteği içerir. örneğin, kimlik doğrulaması bir Windows hizmetiyle kullanıldığında HTTPS için uygulamayı yapılandırın.

Not

hizmet uç noktasının güvenliğini sağlamak için ASP.NET Core HTTPS geliştirme sertifikası kullanılması desteklenmez.

Geçerli dizin ve içerik kökü

bir Windows hizmeti için çağırarak döndürülen geçerli çalışma dizini GetCurrentDirectory C: \ Windows \ system32 klasörüdür. System32 klasörü, bir hizmetin dosyalarını (örneğin, ayarlar dosyaları) depolamak için uygun bir konum değildir. Bir hizmetin varlık ve ayar dosyalarını sürdürmek ve erişmek için aşağıdaki yaklaşımlardan birini kullanın.

Uygulamanın klasörü için içerik kök yolunu ayarla

, ContentRootPath binPath Bir hizmet oluşturulduğunda bağımsız değişkene aynı yol olarak sağlanır. GetCurrentDirectoryAyarlar dosyalarına yollar oluşturmak için çağırmak yerine, SetCurrentDirectory uygulamanın içerik kökününyolunu çağırın.

İçinde Program.Main , hizmetin yürütülebilir dosyasının yolunu belirleyin ve uygulamanın içerik kökünü oluşturmak için yolu kullanın:

var pathToExe = Process.GetCurrentProcess().MainModule.FileName;
var pathToContentRoot = Path.GetDirectoryName(pathToExe);
Directory.SetCurrentDirectory(pathToContentRoot);

CreateWebHostBuilder(args)
    .Build()
    .RunAsService();

Hizmetin dosyalarını diskte uygun bir konumda depolayın

SetBasePathDosyaları içeren klasöre kullanırken ile mutlak bir yol belirtin IConfigurationBuilder .

Sorun giderme

Windows hizmet uygulamasının sorunlarını gidermek için, bkz ASP.NET Core projelerinde sorun giderme ve hata ayıklama ..

Sık karşılaşılan hatalar

  • PowerShell 'in eski veya yayın öncesi sürümü kullanımda.
  • Kayıtlı hizmet, DotNet Publish komutundan uygulamanın yayımlanmış çıktısını kullanmaz. DotNet Build komutunun çıkışı, uygulama dağıtımı için desteklenmez. Yayımlanan varlıklar, dağıtım türüne bağlı olarak aşağıdaki klasörlerden birinde bulunur:
    • bin/Release/{Target Framework}/Publish (FDD)
    • bin/Release/{Target Framework}/{RUNTIME tanımlayıcısı}/Publish (SCD)
  • Hizmet çalışır durumda değil.
  • Uygulamanın kullandığı kaynakların yolları (örneğin, sertifikalar) yanlış. Windows bir hizmetin temel yolu c: \ Windows \ System32' dir.
  • Kullanıcı, hizmet hakları olarak oturum açma hakkına sahip değil.
  • PowerShell komutu çalıştırılırken kullanıcının parolasının kullanım dışı veya yanlış şekilde geçirilmesi New-Service .
  • uygulama ASP.NET Core kimlik doğrulaması gerektiriyor, ancak güvenli bağlantılar (HTTPS) için yapılandırılmamış.
  • İstek URL 'SI bağlantı noktası yanlış veya uygulamada doğru şekilde yapılandırılmamış.

Sistem ve uygulama olay günlükleri

Sistem ve uygulama olay günlüklerine erişin:

  1. Başlat menüsü açın, Olay Görüntüleyicisi arayın ve Olay Görüntüleyicisi uygulamayı seçin.
  2. Olay Görüntüleyicisi Windows günlükler düğümünü açın.
  3. Sistem olay günlüğünü açmak için sistem ' i seçin. Uygulama olay günlüğünü açmak için uygulama ' yı seçin.
  4. Hatalı uygulamayla ilişkili hataları arayın.

Uygulamayı komut isteminden çalıştırma

Birçok başlatma hatası olay günlüklerinde yararlı bilgiler oluşturmaz. Uygulamayı barındırma sisteminde bir komut isteminde çalıştırarak bazı hataların nedenini bulabilirsiniz. Uygulamadan ek ayrıntı günlüğe kaydetmek için, günlük düzeyini düşürün veya geliştirme ortamındauygulamayı çalıştırın.

Paket önbelleklerini temizle

Çalışan bir uygulama, geliştirme makinesindeki .NET Core SDK yükseltmeden veya uygulama içindeki paket sürümlerini değiştirirken hemen başarısız olabilir. Bazı durumlarda, önemli paketler ana yükseltmeler gerçekleştirirken bir uygulamayı bozabilir. Bu sorunların çoğu aşağıdaki yönergeleri izleyerek düzeltilebilir:

  1. Bin ve obj klasörlerini silin.

  2. Bir komut kabuğundan DotNet NuGet yerelleri, Tümünü Temizle ' i yürüterek paket önbelleklerini temizleyin.

    Paket önbelleklerini Temizleme, nuget.exe aracı ile de gerçekleştirilebilir ve komutu yürütülebilir nuget locals all -clear . nuget.exe , Windows masaüstü işletim sistemiyle paketlenmiş bir yüklemedir ve NuGet web sitesindenayrı olarak alınmalıdır.

  3. Projeyi geri yükleyin ve yeniden derleyin.

  4. Uygulamayı yeniden dağıtmadan önce sunucusundaki dağıtım klasöründeki tüm dosyaları silin.

Yavaş veya yanıt vermeyen uygulama

Kilitlenme dökümü , sistem belleğinin bir anlık görüntüsüdür ve uygulama kilitlenmesinin, başlatma hatasının veya yavaş uygulamanın nedenini belirlemenize yardımcı olabilir.

Uygulama kilitleniyor veya bir özel durumla karşılaşırsa

Windows Hata Bildirimi bir döküm edinin ve çözümleyin (WER):

  1. Kilitlenme dökümü dosyalarını tutmak için bir klasör oluşturun c:\dumps .

  2. Enabledökümler PowerShell betiğini uygulama yürütülebilir adıyla çalıştırın:

    .\EnableDumps {APPLICATION EXE} c:\dumps
    
  3. Uygulamayı kilitlenmenin oluşmasına neden olan koşullar altında çalıştırın.

  4. Kilitlenme gerçekleştirildikten sonra, Disabledökümler PowerShell betiğiniçalıştırın:

    .\DisableDumps {APPLICATION EXE}
    

Uygulama kilitlenmeleri ve döküm koleksiyonu tamamlandıktan sonra, uygulamanın normal olarak sonlandırılmasına izin verilir. PowerShell betiği, WER 'i uygulama başına en fazla beş döküm toplayacak şekilde yapılandırır.

Uyarı

Kilitlenme dökümleri büyük miktarda disk alanı kaplar (her birine kadar çok gigabayt kadar).

Uygulama yanıt vermiyor, başlatma sırasında başarısız oluyor veya normal şekilde çalışıyor

Bir uygulama askıda kaldığında (yanıt vermeyi keser ancak kilitlenmez), başlatma sırasında başarısız olur veya normal şekilde çalışır. Kullanıcı modu döküm dosyaları: döküm oluşturmak için uygun bir aracı seçmek üzere en iyi aracı seçme.

Dökümü çözümle

Bir döküm çeşitli yaklaşımlar kullanılarak analiz edilebilir. Daha fazla bilgi için bkz. User-Mode döküm dosyasını çözümleme.

Ek kaynaklar