240 likes | 433 Views
Programowanie Aplikacji Lokalnych .NET. Usługi Monitorowanie aplikacji Konfiguracja. Serwis vs proces. S. moga być uruchamiane na starcie ( automatycznie ) lub na życzenie procesów / recznie przez użytkownika
E N D
Programowanie Aplikacji Lokalnych .NET Usługi Monitorowanie aplikacji Konfiguracja
Serwisvsproces • S. mogabyćuruchamianenastarcie (automatycznie) lubnażyczenieprocesów/recznieprzezużytkownika • S. jest uruchamianyprzezSCMmożezostaćuruchomionybezzalogowaniaużytkownika • S. sąnadzorowaneprzez system imogąbyćautomatyczniewznawiane w razieupadku • S. niemajądostepu do podsystemuUI (ale możnanapisaćdodatkowyproces, którysie z nimibędziekomunikować) • S. powinnyzapisywaćzdarzenia do logusystemowego • Domyslnykontekstdzialaniadlaserwisu to local_system (możebyćskonfigurowanyjakokontekstodpowiadającudowolnemuużytkownikowi – popodaniuhasła)
Konstrukcja serwisu • Przestrzeńnazw: System.ServiceProcess • Watek roboczy + uruchamiany w OnStart() public partial class Service1 : ServiceBase { public Service1() {InitializeComponent(); } protected override void OnStart(string[] args) {// TODO: Add code here to start your service.} protected override void OnStop() {// TODO: Add code here to perform any tear-down} } } • Inne: CanStop, CanPauseAndContinue, OnPause, OnContinue
Konstrukcja serwisu static class Program { static void Main() { ServiceBase[] ServicesToRun; // possible more than one service object. For example, // ServicesToRun = new ServiceBase[] {new Service1(), // new MySecondUserService()}; // ServicesToRun = new ServiceBase[] { new Service1() }; ServiceBase.Run(ServicesToRun); } } • zarządzaniedziałającymserwisem (funkcjonalnośćanalogiczna do oferowanejprzezSCM): ServiceController
Konstrukcja serwisu !!!!Wskazaneabydlapotrzebdebugowania: • serwismógłsięuruchamiaćjakozwykły proces – (np. przyodpowiednimparametrzeprzekazanym do Main – ta bezpośredniouruchamiafunkcjęodpowiadającą wątkowiroboczemu) lub • wydzielić logikę serwisu w postaci oddzielnej biblioteki wykorzystywanej przez serwis oraz konwencjonalną aplikacje testową
(De)Instalacja serwisu • plik .reg • programowyzapis do rejestru • wykonywanaprzezoddzielnąaplikacjęlubinicjowanaprzez Main (w plikuwykonywalnymserwisu) popodaniuodpowiedniegoparamertu • wykorzystanieklasyServiceProcessInstaller/ ServiceInstaller+ InstallUtil [RunInstallerAttribute(true)] public class MyProjectInstaller: Installer{ private ServiceInstallerinstaller; //private ServiceProcessInstaller installer; public MyProjectInstaller(){installer = new ServiceInstaller();//installer = new ServiceProcessInstaller ();installer.Account =ServiceAccount.LocalSystem;installer.StartType = ServiceStartMode.Manual;installer.ServiceName = "Hello-World Service 1";Installers.Add(installer); } }
Zmiany w Windows Vista/7 • Failure Detection and Recovery – w przypadku problemu ze startem SCM moze restartować serwis lub podjąc inna akcjęChangeServiceConfig2+SERVICE_CONFIG_DELAYED_AUTO_START_INFO • Delayed autostart – autostart jest wykonywany z opóznieniem ChangeServiceConfig2+SERVICE_CONFIG_DELAYED_AUTO_START_INFO • Preshutdown Notifications – uprzedzenie że zamykanie serwisu może trwać dłużej niż 30sChangeServiceConfig2+SERVICE_CONTROL_PRESHUTDOWN • Service Isolation :ChangeServiceConfig2+SERVICE_CONFIG_SERVICE_SID_INFO • Sesja 0 jest teraz wyłącznie używana przez serwisy (dawniej do niej trafial pierwszy logujący się użytkownik)– serwis nie moze wysłac messedza systemowego do aplikaci ani vversa. Nie mozna wyswietlić dialogu inaczej niż WTSSendMessage. • Serwis może izolować do swojego (via SID) użytku obiekty takie jak pliki klucze rejestru.
Diagnostyka Monitorowanie aplikacji
EventLog – realizacja • Jednolity sposób raportowania - System rejestruje zdarzenia w logu • 3 predefiniwane logi System/Security/Application – możliwość twornia własnych logów systemowych • Różne klasy zdarzeń (Error/Warning/Information) • Możliwość filtrowania po aplikacji/sortowanie itd. • Konfigurowalne zachowanie • np. maks. rozmiar • rozmiar/okres po którym następuje nadpisywanie zdarzeń • możliwość eksportu/importu dziennika (np. z innej maszyny) • (np można określić jakie zdarzenia i dla jakich obiektów są notowane w dzienniku security) • Możliwość zasubskrybowania przez aplikację zdarzeń wpisywanych do określonego logu przez inne aplikacje
EventLog– Dziennikzdarzeń • PrzestrzeńnazwSystem.Diagnostics • KlasaEventLogmyLog • tworzenieprywatnegologu: EventLog.CreateEventSource • zapis do logu: myLog.WriteEntry • programoweprzeglądaniemyLog.Entries • subsrybcjanazdarzeniazapisywane w logu: myLog.EntryWritten += newEntryWrittenEventHandler(MyOnEntryWritten);myLog.EnableRaisingEvents = true;
Monitorowanie aplikacji: • Konfigurowalność • Poziomszczegółowości (konfigurowalnybezrekompilacji) • Różnysposóbprezentacjidlaróznychtypówzdarzeńnp. Błedyzapisujemy do dziennika a wszystkotj.iInformacje, ostrzeżeniaibłędy do loguplikowego • Możliwośćokreślenialokalizacji/rozmiaryplikówloguitd. • Wymagany małynarzut w przypadku normalnej pracy Rozwiązaniagotowe: • Log4net • Logging & Instrumentation Application Block
Debugowanie: system.diagnostics.debugger IsAttached Break IsLogging Log system.diagnostics.debug Write, WriteIf, WriteLine, WriteLineIf Własny listener System.Diagnostics.Trace.Listeners.Add(myListener);
Instrumentacja: Udostępnienie na poziomie performace monitora/ WMI/MOM charakterystyk obiektów (aplikacji) oraz zdarzeń. Zastosowania: • Monitorowanie dostępności • Monitorowanie wielkości charakteryzujących działanie aplikacji • Monitorowanie zdarzeń i komunikatów aplikacji • Dynamiczna konfiguracja i kontrola • System.Management.Instrumentation
Konfiguracja aplikacji • Plikikonfiguracyjne: • ini (przestarzale) • własne pliki xml (serializacja klas) • System.Configuration
ConfigurationManager • od .NET 2.0 • wykorzystujeSampleApp.exe.config ConfigurationManager.AppSettings[”nazwa”] inne sekcje: SectionInformation PropertyInformation ElementInformation ContextInformation ConfigurationSectionGroup własne sekcje: GetSection
<configuration> <startup> <supportedRuntime version="v1.1.4322"/> <supportedRuntime version="v1.0.3705"/> <requiredRuntime version="v1.0.3705" safemode="true"/> </startup> <runtime> <developmentModedeveloperInstallation="true"/> <assemblyBindingxmlns="urn:schemas-microsoft-com:asm.v1"> <probing privatePath="bin;bin2\subbin;bin3"/> <dependentAssembly> <assemblyIdentity name="myAssembly" publicKeyToken="32ab4ba45e0a69a1" culture="neutral" /> <bindingRedirectoldVersion="1.0.0.0" newVersion="2.0.0.0"/> </dependentAssembly> </assemblyBinding> </runtime> </configuration>
Rejestr - Narzędzia • RegEdit • RegEdit32
Struktura • Głównegałęzie • HKEY_CLASSES_ROOT • HKEY_CURRENT_USER • HKEY_LOCAL_MACHINE • HKEY_USERS • HKEY_CURRENT_CONFIG • Typywartości: BINARY, DWORD, DWORD_LITTLE_ENDIAN, DWORD_BIG_ENDIAN, EXPAND_SZ, LINK, MULTI_SZ, NONE, RESOURCE_LIST, SZ
API • RegOpenKeyEx • RegEnumKeyEx, RegEnumValueEx • RegQueryInfoKey, RegQueryValueKey • RegSetValueKey • RegCreateKeyEx, RegDeleteKeyEx • RegReplaceKey – mod. przyrestarciesystemu • RegConnectKey – zdalnyrejestr • SetKeySecurity • RegLoadKey, RegSaveKey
API w .NET Namespace Microsoft.Win32 KlasaRegistry Pola (typuRegistryKey): • ClassesRoot - HKEY_CLASSES_ROOT. • CurrentConfig - HKEY_CURRENT_CONFIG. • CurrentUser - HKEY_CURRENT_USER • DynData- HKEY_DYN_DATA. • LocalMachine - HKEY_LOCAL_MACHINE. • PerformanceData -HKEY_PERFORMANCE_DATA. • Users - HKEY_USERS.
API w .NET Namespace Microsoft.Win32 KlasaRegistryKey Pola: Name, SubKeyCount, ValueCount Metody: • OpenSubKey, Close, • CreateSubKey, DeleteSubKey, DeleteValue, DeleteSubKeyTree, • GetSubKeyNames, GetValue, SetValue, GetValueNames • OpenRemoteBaseKey