في .NET Core 3.0 ، نعرض نوعًا جديدًا من قالب التطبيق يسمى Worker Service. يهدف هذا القالب إلى منحك نقطة بداية لكتابة خدمات طويلة المدى في .NET Core. في هذا الاستعراض ، سنقوم بإنشاء عامل وتشغيله كخدمة Windows.

خلق عامل
معاينة ملاحظة: في إصدارات المعاينة الخاصة بنا ، يكون قالب العامل في نفس قائمة قوالب الويب. هذا سوف يتغير في إصدار مستقبلي. نعتزم وضع قالب "خدمة العمال" داخل معالج إنشاء مشروع جديد مباشرةً.
إنشاء عامل في Visual Studio



إنشاء عامل في سطر الأوامر
تشغيل dotnet new worker

تشغيل كخدمة ويندوز
من أجل التشغيل كخدمة Windows ، نحتاج إلى عاملنا للاستماع لبدء وإيقاف الإشارات من ServiceBase
، نوع .NET الذي يعرض أنظمة Windows Service إلى تطبيقات .NET. للقيام بذلك ، نريد:
إضافة حزمة Microsoft.Extensions.Hosting.WindowsServices
NuGet

أضف استدعاء UseServiceBaseLifetime
إلى HostBuilder
في Program.cs
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>(); }); }
هذه الطريقة تفعل عدة أشياء. أولاً ، يتحقق ما إذا كان التطبيق يعمل بالفعل كخدمة من خدمات Windows أم لا ، وإذا لم يكن كذلك ، فإنه لا يعمل على جعل هذه الطريقة آمنة ليتم الاتصال بها عند تشغيله محليًا أو عند تشغيله كخدمة Windows. لا تحتاج إلى إضافة جمل حماية إليه ، ويمكنك فقط تشغيل التطبيق بشكل طبيعي عندما لا يتم تثبيت كخدمة Windows.
ثانياً ، يقوم بتكوين المضيف الخاص بك لاستخدام ServiceBaseLifetime
. يعمل ServiceBaseLifetime
مع ServiceBase
للمساعدة في التحكم في عمر التطبيق الخاص بك عند تشغيله كخدمة Windows. هذا يتجاوز ConsoleLifetime
الافتراضي الذي يعالج إشارات مثل CTL + C.
تثبيت العامل
بمجرد قيام ServiceBaseLifetime
باستخدام ServiceBaseLifetime
نحتاج بعد ذلك إلى تثبيته:
أولا ، يتيح نشر التطبيق. سنقوم بتثبيت خدمة Windows في مكانها ، مما يعني أنه سيتم قفل exe عند تشغيل الخدمة. تعد خطوة النشر طريقة رائعة للتأكد من أن جميع الملفات التي أحتاج إليها لتشغيل الخدمة في مكان واحد وجاهزة للتثبيت.
dotnet publish -oc:\code\workerpub
ثم يمكننا استخدام الأداة المساعدة sc في موجه أوامر المشرف
sc create workertest binPath=c:\code\workerpub\WorkerTest.exe
على سبيل المثال:

ملاحظة الأمان: يشتمل هذا الأمر على تشغيل الخدمة كنظام محلي ، وهو أمر لا تريد القيام به عمومًا . بدلاً من ذلك ، يجب عليك إنشاء حساب خدمة وتشغيل خدمة windows كهذا الحساب. لن نتحدث عن ذلك هنا ، ولكن هناك بعض الوثائق حول مستندات ASP.NET التي تتحدث عنها هنا: https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/windows- الخدمة؟ عرض = aspnetcore-2.2
تسجيل
يحتوي نظام التسجيل على موفر "سجل الأحداث" يمكنه إرسال رسالة السجل مباشرة إلى سجل أحداث Windows. لتسجيل الدخول إلى سجل الأحداث ، يمكنك إضافة حزمة Microsoft.Extensions.Logging.EventLog
ثم تعديل Program.cs
:
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureLogging(loggerFactory => loggerFactory.AddEventLog()) .ConfigureServices(services => { services.AddHostedService<Worker>(); });
العمل في المستقبل
في المعاينات القادمة ، نخطط لتحسين تجربة استخدام Workers with Windows Services من خلال:
- إعادة تسمية UseWindowsServiceBaseLifetime إلى UseWindowsService
- أضف التكامل التلقائي والمحسّن مع "سجل الأحداث" عند تشغيله كخدمة Windows.
استنتاج
نأمل أن تجرب هذا القالب الجديد وتريد منك إخبارنا كيف ستسير الأمور ، يمكنك تقديم أي أخطاء أو اقتراحات هنا: https://github.com/aspnet/AspNetCore/issues/new/choose
