Windows Topshelf
Powrót

Usługi Windows z Topshelf

W tym artykule . Naszym celem będzie stworzenie customowej usługi wrazz projektem Topshelf. W tej chwili powinny pojawić się dwa pytania. Dlaczego Windows Service i dlaczego Topshelf? Windows Service, ponieważ często pojawia się wymóg, który zmusza nas do dostarczenia takiego rozwiązania. Oczywiście, są przypadki, kiedy możemy użyć czegoś takiego jak Hangfire, ale czasami nie jest to dobra opcja. Czasami musimy stworzyć dobry Windows Sercice w starym stylu. Jest to wykonalne, ale nie takie łatwe. Do tego jesteśmy zmuszeni stworzyć infrastrukturę, która nie jest logiczną częścią aplikacji. , a wiadomo, że czas to pieniądz. Dlatego zacząłem używać Topshelfa. Ten projekt upraszcza powtarzalne zadanie i pozwala skupić się na rzeczywistej logice obsługiwanej przez Windows Service.

Pierwszy krok i cel

Skoro już wiemy, jaki jest cel, zacznijmy kodować. Podobnie jak w przypadku każdego nowego projektu, najlepszym miejscem do rozpoczęcia jest strona główna projektu. W tym przypadku adresem URL będzie http://topshelf-project.com/. Tam możemy znaleźć wszystkie podstawowe informacje i dokumentację projektu.

Wszyscy jesteśmy programistami. Wiemy, że najlepszym sposobem uczenia się jest działanie. Więc zamierzamy stworzyć działający Windows Service, używając Topshelfa. Celem tej usługi będzie monitorowanie folderu i usuwanie plików, które mogą być niebezpieczne. Powiedzmy, że boimy się plików, które mają w nazwie słowo „virus”. To nie jest najlepsza ochrona, ale zawsze coś.

Kod

Pierwsza sprawa to stworzenie projektu i zainstalowanie potrzebnych pakietów NuGet. Aplikacja konsolowa to projekt, którego potrzebujemy. Pakiety, z których będziemy korzystać to Topshelf i Topshelf.Nlog. Pierwszy zawiera główne funkcje Topshelf, a drugi pozwala nam dodać funkcje Nlog do naszego kodu Topshelf. Teraz, gdy mamy podstawową wiedzę, zajmijmy się kodem.

public static class ExtendedMethod {     public static void Rename(this FileInfo fileInfo, string newName)     {         fileInfo.MoveTo(fileInfo.Directory.FullName + "\\" + newName);     } }

Nasz kod będzie używał jednej metody rozszerzającej funkcjonalność klasy FileInfo. Metoda ta pozwala nam zmienić nazwę pliku, poprzez dostarczenie nowej nazwy pliku

public static class UtilityMethods {     public static bool GetExclusiveAccess(string filePath)     {         try         {             using (FileStream file = new FileStream(filePath, FileMode.Append, FileAccess.Write))             {                 file.Close();                 return true;             }         }         catch (IOException)         {             return false;         }     } }

Potrzebujemy również metody UtilityMethods. Sprawdza ona, czy plik nie jest używany przez żaden proces. Potrzebujemy takiej metody, ponieważ FileSystemWatcher jest bardzo agresywny, jeśli chodzi o dostęp do plików.

public class ServiceLogic {     private FileSystemWatcher _fileSystemWatcher;     private static readonly LogWriter _logger = HostLogger.Get<ServiceLogic>();       public bool Start()     {         _fileSystemWatcher = new FileSystemWatcher(@"d:\TopShelfDemo", "*.jpg");         _fileSystemWatcher.NotifyFilter = NotifyFilters.Attributes |                 NotifyFilters.CreationTime |                 NotifyFilters.FileName |                 NotifyFilters.LastAccess |                 NotifyFilters.LastWrite |                 NotifyFilters.Size |                 NotifyFilters.Security;           _fileSystemWatcher.Created += (sender, args) =>             {                 while (true)                 {                     Thread.Sleep(2500);                     if (UtilityMethods.GetExclusiveAccess(args.FullPath))                     {                         var fileInfo = new FileInfo(args.FullPath);                           if (args.Name.ToLower().Contains("virus"))                         {                             fileInfo.Delete();                             _logger.InfoFormat("{0} deleted", args.FullPath);                         }                         else                         {                             fileInfo.Rename(Path.GetFileNameWithoutExtension(args.FullPath) + "_ValidFile" + fileInfo.Extension);                             _logger.InfoFormat("{0} veryfied", args.FullPath);                         }                           break;                     }                 }                 };           _fileSystemWatcher.EnableRaisingEvents = true;           return true;     }       public bool Stop()     {         _fileSystemWatcher.Dispose();         return true;     } }

Ta klasa jest sercem i duszą naszego serwisu/systemu. Celem tej klasy jest przechowywanie logiki dla naszego Windows Service. Zasadniczo ma dwie metody. Start () i stop (). Te metody odpowiadają zdarzeniom, które mogą wystąpić w windows service. Nie są to wszystkie możliwe zdarzenia. Może jeszcze wystąpić np. pause i nie tylko. Metoda Start ()ustawia File watcheri sprawia, że reaguje on na tworzenie plików jpg w określonym folderze. Utworzony plik jest weryfikowany lub usuwany. Wszystkie informacje o realizowanych czynnościach są zapisywane do dziennika logu przy użyciu Nlog. A metoda stop () czyści obiekty, które stworzyliśmy w metodzie start ().

Zobaczmy teraz, dlaczego Topshelf jest tak przydatny.

class Program { static void Main(string[] args) { HostFactory.Run(serviceConfig => { serviceConfig.UseNLog(); serviceConfig.Service<ServiceLogic>(serviceInstance => { serviceInstance.ConstructUsing(() => new ServiceLogic()); serviceInstance.WhenStarted(serviceLogic => serviceLogic.Start()); serviceInstance.WhenStopped(serviceLogic => serviceLogic.Stop()); }); serviceConfig.EnableServiceRecovery(option => { option.RestartService(5); option.RestartService(30); option.RestartComputer(60,"Error with top shelf demo"); }); serviceConfig.SetServiceName("TopShelfDemoServiceName"); serviceConfig.SetDisplayName("Top Shelf Demo Service Display Name"); serviceConfig.StartAutomatically(); }); } }

To dosłownie cały kod, który musimy napisać. Konfiguracja jest dziecinnie łatwa.

Ustawiamy logger.

Ustawiamy  zdarzenia.

Konfigurujemy akcje na wypadek błędu.

Instalacja

Instalację usługi można przeprowadzić za pomocą Windows Power Shell. Aby to zrobić, musimy przejść do folderu bin / debug i uruchomić:. \ TopShelfDemo install. Po tym nowa usługa będzie widoczna na liście usług systemowych.

Wszystko, co teraz musimy zrobić, to nacisnąć przycisk uruchomienia i usługa zacznie działać. Sprawdźmy, czy to działa. Wkleję kilka plików do monitorowanego folderu.

Po wykonaniu tej czynności plik dziennika jest wypełniany. Widzimy, że dwa pliki zostały zweryfikowane, a jeden usunięty. Ponieważ zawierał słowo „virus”.

Wniosek

Topshelf ułatwia nam pracę przy tworzeniu Windows Service.

Mam nadzieję, że artykuł Ci się spodobał. Jeśli jesteś zainteresowany, kod jest dostępny pod adresem: https://github.com/Nivo1985/TopShelfDemo.


Karol Rogowski

Ta strona używa plików cookie w celach statystycznych, reklamowych i funkcjonalnych. Możesz zaakceptować pliki cookie lub wyłączyć je w ustawieniach przeglądarki.