Di .NET Core 3.0 kami memperkenalkan jenis baru templat aplikasi yang disebut Worker Service. Templat ini dimaksudkan untuk memberi Anda titik awal untuk menulis layanan yang berjalan lama di .NET Core. Dalam langkah-langkah ini kami akan membuat pekerja dan menjalankannya sebagai Layanan Windows.

Buat pekerja
Pratinjau Catatan: Dalam rilis pratinjau kami, templat pekerja ada di menu yang sama dengan templat Web. Ini akan berubah di rilis mendatang. Kami bermaksud untuk menempatkan templat Layanan Pekerja langsung di dalam panduan pembuatan proyek baru.
Buat Pekerja di Visual Studio



Buat Pekerja di baris perintah
Jalankan dotnet new worker

Jalankan sebagai Layanan Windows
Untuk menjalankan sebagai Layanan Windows, kami membutuhkan pekerja kami untuk mendengarkan sinyal mulai dan berhenti dari ServiceBase
tipe .NET yang memaparkan sistem Layanan Windows ke aplikasi .NET. Untuk melakukan ini kami ingin:
Tambahkan paket NuGet Microsoft.Extensions.Hosting.WindowsServices

Tambahkan panggilan UseServiceBaseLifetime
ke HostBuilder
di Program.cs kami
public class Program { public static void Main(string[] args) { CreateHostBuilder(args).Build().Run(); } public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .UseServiceBaseLifetime() .ConfigureServices(services => { services.AddHostedService<Worker>(); }); }
Metode ini melakukan beberapa hal. Pertama, ia memeriksa apakah aplikasi tersebut benar-benar berjalan sebagai Layanan Windows, jika tidak maka tidak ada yang membuat metode ini aman untuk dipanggil ketika dijalankan secara lokal atau ketika dijalankan sebagai Layanan Windows. Anda tidak perlu menambahkan klausul penjaga dan hanya dapat menjalankan aplikasi secara normal saat tidak diinstal sebagai Layanan Windows.
Kedua, ini mengonfigurasi host Anda untuk menggunakan ServiceBaseLifetime
. ServiceBaseLifetime
bekerja dengan ServiceBase
untuk membantu mengontrol masa pakai aplikasi Anda ketika dijalankan sebagai Layanan Windows. Ini menimpa ConsoleLifetime
default yang menangani sinyal seperti CTL + C.
Instal Pekerja
Setelah pekerja kami menggunakan ServiceBaseLifetime
kami harus menginstalnya:
Pertama, mari publikasikan aplikasinya. Kami akan menginstal Layanan Windows di tempat, artinya exe akan dikunci setiap kali layanan berjalan. Langkah mempublikasikan adalah cara yang bagus untuk memastikan semua file yang saya butuhkan untuk menjalankan layanan berada di satu tempat dan siap untuk diinstal.
dotnet publish -oc:\code\workerpub
Kemudian kita bisa menggunakan utilitas sc dalam prompt perintah admin
sc create workertest binPath=c:\code\workerpub\WorkerTest.exe
Sebagai contoh:

Catatan keamanan: Perintah ini menjalankan layanan sebagai sistem lokal, yang biasanya bukan sesuatu yang ingin Anda lakukan . Alih-alih, Anda harus membuat akun layanan dan menjalankan layanan windows sebagai akun itu. Kami tidak akan membicarakan hal itu di sini, tetapi ada beberapa dokumentasi tentang dokumen ASP.NET yang membicarakannya di sini: https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/windows- layanan? view = aspnetcore-2.2
Penebangan
Sistem pencatatan memiliki penyedia Log Kejadian yang dapat mengirim pesan log langsung ke Log Kejadian Windows. Untuk masuk ke log peristiwa Anda dapat menambahkan paket Microsoft.Extensions.Logging.EventLog
dan kemudian memodifikasi Program.cs
Anda:
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureLogging(loggerFactory => loggerFactory.AddEventLog()) .ConfigureServices(services => { services.AddHostedService<Worker>(); });
Pekerjaan di masa depan
Dalam pratinjau mendatang, kami berencana untuk meningkatkan pengalaman menggunakan Pekerja dengan Layanan Windows dengan:
- Ganti nama UseWindowsServiceBaseLifetime menjadi UseWindowsService
- Tambahkan integrasi otomatis dan yang ditingkatkan dengan Log Kejadian saat berjalan sebagai Layanan Windows.
Kesimpulan
Kami harap Anda mencoba templat baru ini dan ingin Anda memberi tahu kami bagaimana hasilnya, Anda dapat mengajukan bug atau saran di sini: https://github.com/aspnet/AspNetCore/issues/new/choose
