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:
- .NET Core şablonundan bir Çalışan Hizmeti uygulaması oluşturun.
- 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.
- Yeni bir proje oluşturma.
- Çalışan hizmeti seçin. İleri’yi seçin.
- Proje adı alanında bir proje adı girin veya varsayılan proje adını kabul edin. Oluştur’u seçin.
- 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
WindowsServiceLifetimeayarlar. - İç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ı
CreateDefaultBuilderveya daha yüksek bir düzeydir. - Appsettings'te anahtarıyla
Logging:EventLog:LogLevel:Defaultvarsayı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:
- secpol.msc çalıştırarak Yerel Güvenlik İlkesi düzenleyicisini açın.
- Yerel İlkeler düğümünü genişletin ve Kullanıcı Hakları Ataması'ı seçin.
- Hizmet olarak oturum aç ilkesi'i açın.
- Kullanıcı veya Grup Ekle'yi seçin.
- Aşağıdaki yaklaşımlardan birini kullanarak nesne adını (kullanıcı hesabı) girin:
- Nesne adı alanına kullanıcı hesabını (
{DOMAIN OR COMPUTER NAME\USER}) yazın ve tamam'ı seçerek ilkeye kullanıcı ekleyin. - 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.
- Nesne adı alanına kullanıcı hesabını (
- 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ı:
StartingRunningStoppingStopped
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:
- Başlat menüsü açın, Olay Görüntüleyicisi arayın ve Olay Görüntüleyicisi uygulamayı seçin.
- Olay Görüntüleyicisi Windows günlükler düğümünü açın.
- 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.
- 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:
Bin ve obj klasörlerini silin.
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.Projeyi geri yükleyin ve yeniden derleyin.
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):
Kilitlenme dökümü dosyalarını tutmak için bir klasör oluşturun
c:\dumps.Enabledökümler PowerShell betiğini uygulama yürütülebilir adıyla çalıştırın:
.\EnableDumps {APPLICATION EXE} c:\dumpsUygulamayı kilitlenmenin oluşmasına neden olan koşullar altında çalıştırın.
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
- Kestrel uç nokta YAPıLANDıRMASı (https yapılandırması ve SNI desteği içerir)
- Kestrel uç nokta YAPıLANDıRMASı (https yapılandırması ve SNI desteği içerir)
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:
- Yerel Güvenlik Ilkesi düzenleyicisini, secpol. msc' i çalıştırarak açın.
- Yerel ilkeler düğümünü genişletin ve Kullanıcı hakları ataması' nı seçin.
- Hizmet olarak oturum açma ilkesi açın.
- Kullanıcı veya Grup Ekle' yi seçin.
- Aşağıdaki yaklaşımlardan birini kullanarak nesne adını (Kullanıcı hesabı) sağlayın:
- 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. - 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.
- Kullanıcı hesabını (
- 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:
StartingRunningStoppingStopped
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 :
WebHostService
OnStarting,OnStartedVe yöntemleriyle türetilen bir sınıf oluşturunOnStopping:[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(); } }' A geçişi için bir genişletme yöntemi oluşturun IWebHost
CustomWebHostServiceRun :public static class WebHostServiceExtensions { public static void RunAsCustomService(this IWebHost host) { var webHostService = new CustomWebHostService(host); ServiceBase.Run(webHostService); } }İçinde
Program.Main,RunAsCustomServiceyerine 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-Servicebir ş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:
- Başlat menüsü açın, Olay Görüntüleyicisi için arama Olay Görüntüleyicisi seçin.
- Bu Olay Görüntüleyicisi Günlükler düğümünü Windows açın.
- Sistem Olay Günlüğü'lerini açmak için Sistem'i seçin. Uygulama'ya seçerek Uygulama Olay Günlüğü'lerini açın.
- 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:
Bin ve obj klasörlerini silin.
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 -clearolabilir. 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.Projeyi geri yükleme ve yeniden oluşturma.
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:
'de kilitlenme dökümü dosyalarını tutmak için bir klasör
c:\dumpsoluşturun.EnableDumps PowerShell betiği uygulama yürütülebilir adıyla çalıştırın:
.\EnableDumps {APPLICATION EXE} c:\dumpsUygulamayı kilitlenmeye neden olan koşullar altında çalıştırın.
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
- Kestrel uç nokta yapılandırması (HTTPS yapılandırması ve SNI desteği içerir)
- ASP.NET Core Web ana bilgisayarı
- ASP.NET Core projelerinde sorun giderme ve hata ayıklama
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
CreateWebHostBuildergerç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:
- Yerel Güvenlik Ilkesi düzenleyicisini, secpol. msc' i çalıştırarak açın.
- Yerel ilkeler düğümünü genişletin ve Kullanıcı hakları ataması' nı seçin.
- Hizmet olarak oturum açma ilkesi açın.
- Kullanıcı veya Grup Ekle' yi seçin.
- Aşağıdaki yaklaşımlardan birini kullanarak nesne adını (Kullanıcı hesabı) sağlayın:
- 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. - 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.
- Kullanıcı hesabını (
- 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:
StartingRunningStoppingStopped
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 :
WebHostService
OnStarting,OnStartedVe yöntemleriyle türetilen bir sınıf oluşturunOnStopping:[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(); } }' A geçişi için bir genişletme yöntemi oluşturun IWebHost
CustomWebHostServiceRun :public static class WebHostServiceExtensions { public static void RunAsCustomService(this IWebHost host) { var webHostService = new CustomWebHostService(host); ServiceBase.Run(webHostService); } }İçinde
Program.Main,RunAsCustomServiceyerine 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:
- Başlat menüsü açın, Olay Görüntüleyicisi arayın ve Olay Görüntüleyicisi uygulamayı seçin.
- Olay Görüntüleyicisi Windows günlükler düğümünü açın.
- 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.
- 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:
Bin ve obj klasörlerini silin.
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.Projeyi geri yükleyin ve yeniden derleyin.
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):
Kilitlenme dökümü dosyalarını tutmak için bir klasör oluşturun
c:\dumps.Enabledökümler PowerShell betiğini uygulama yürütülebilir adıyla çalıştırın:
.\EnableDumps {APPLICATION EXE} c:\dumpsUygulamayı kilitlenmenin oluşmasına neden olan koşullar altında çalıştırın.
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
- Kestrel uç nokta YAPıLANDıRMASı (https yapılandırması ve SNI desteği içerir)
- ASP.NET Core Web ana bilgisayarı
- ASP.NET Core projelerinde sorun giderme ve hata ayıklama