使用Topshelf組件構建簡單的Windows服務

來源:互聯網
上載者:User

標籤:gty   unp   參數   選擇   add   eating   背景   form   效率   

     很多時候都在討論是否需要瞭解一個組件或者一個語言的底層原理這個問題,其實我個人覺得,對於這個問題,每個人都有自己的看法,個人情況不同,選擇的方式也就會不同了。我個人覺得無論學習什麼,都應該嘗試著去瞭解對應的原理和源碼(這裡就不要急著吐槽,容我說完)。對底層的瞭解不是為了讓你寫出類似的東西,讓你寫也不可能寫的出來,重寫一個就需要以此修改整個底層結構,瞭解底層知識只是為了讓你可以在寫業務代碼時,選擇合適的方式,以此使底層與業務層配合達到效率最佳。任何一種方式有壞有好,需要合適的選擇。

  如果覺得樓主以上的說法不對,或者有些不妥,還望見諒,因為爭論一個觀點沒有意義,認為對的人自己會去理解,認為不對的,可以忽略。沒有這個必要去花費時間和精力取討論這種事情。

  以上是扯淡,下面切入正題。前面介紹了一個組件Hangfire,用於設定定時任務等等操作,在這裡介紹另一款組件Topshelf。

一.Topshelf組件概述

   Topshelf是.NET平台的Windows服務架構。Topshelf可以輕鬆建立Windows服務,測試服務,調試服務,並最終將其安裝到Windows服務控制管理員(SCM)中。Topshelf通過允許開發人員專註於服務邏輯,而不是與.NET架構中的內建服務支援互動的細節。開發人員不需要瞭解服務類的複雜細節,通過InstallUtil執行安裝,或者瞭解如何將調試器附加到服務以進行故障排除問題。

   建立Windows服務與建立控制台應用程式類似,控制台應用程式建立後,建立一個具有公用Start和Stop方法的單一服務類。服務作業的方式較多,自動,自動(延遲),手動和禁用啟動選項本地系統,本地服務,網路服務,使用者名稱/密碼或安裝期間提示的服務憑證。服務啟動依賴項,包括SQL Server,MSMQ和其他具有不同服務名稱的多執行個體服務安裝服務復原選項,包括重新啟動,重新引導或運行程式。Topshelf與Mono合作,可以將服務部署到Linux。服務安裝功能目前僅限Windows。

二.Topshelf用法說明

      介紹完對應的組件背景概述,在這裡就要介紹一下如何使用這個組件的使用方法。該組件的使用方法有另個方法,都在HostFactory類中,下面具體的介紹一個使用方式。

   1.配置新的服務主機

      HostFactory.New(x =>                {                    // 可以定義不需要介面依賴性的服務,這隻是為了                    //在此樣本中顯示並未使用。                    x.Service<SampleSansInterfaceService>(s =>                        {                            s.ConstructUsing(() => new SampleSansInterfaceService());                            s.WhenStarted(v => v.Start());                            s.WhenStopped(v => v.Stop());                        });                });

   2.配置和運行新的服務主機,處理任何異常並將其寫入日誌

   HostFactory.Run(x =>                {                    x.UseLog4Net("log4net.config");                    x.UseAssemblyInfoForServiceInfo();                    bool throwOnStart = false;                    bool throwOnStop = false;                    bool throwUnhandled = false;                    x.Service(settings => new SampleService(throwOnStart, throwOnStop, throwUnhandled), s =>                    {                        s.BeforeStartingService(_ => Console.WriteLine("BeforeStart"));                        s.BeforeStoppingService(_ => Console.WriteLine("BeforeStop"));                    });                    x.SetStartTimeout(TimeSpan.FromSeconds(10));                    x.SetStopTimeout(TimeSpan.FromSeconds(10));                    x.EnableServiceRecovery(r =>                        {                            r.RestartService(3);                            r.RunProgram(7, "ping google.com");                            r.RestartComputer(5, "message");                            r.OnCrashOnly();                            r.SetResetPeriod(2);                        });                    x.AddCommandLineSwitch("throwonstart", v => throwOnStart = v);                    x.AddCommandLineSwitch("throwonstop", v => throwOnStop = v);                    x.AddCommandLineSwitch("throwunhandled", v => throwUnhandled = v);                    x.OnException((exception) =>                    {                        Console.WriteLine("Exception thrown - " + exception.Message);                    });                });

    3.Topshelf配置操作方法

三.Topshelf核心對象解析

     承接上文,介紹完畢相關背景和常規操作,在這裡介紹一個核心對象的一些方法。

  1.HostFactory.New():

public static Host New(Action<HostConfigurator> configureCallback)        {            try            {                if (configureCallback == null)                    throw new ArgumentNullException("configureCallback");                var configurator = new HostConfiguratorImpl();                Type declaringType = configureCallback.Method.DeclaringType;                if (declaringType != null)                {                    string defaultServiceName = declaringType.Namespace;                    if (!string.IsNullOrEmpty(defaultServiceName))                        configurator.SetServiceName(defaultServiceName);                }                configureCallback(configurator);                configurator.ApplyCommandLine();                ConfigurationResult result = ValidateConfigurationResult.CompileResults(configurator.Validate());                if (result.Message.Length > 0)                {                    HostLogger.Get(typeof(HostFactory))                              .InfoFormat("Configuration Result:\n{0}", result.Message);                }                return configurator.CreateHost();            }            catch (Exception ex)            {                HostLogger.Get(typeof(HostFactory)).Error("An exception occurred creating the host", ex);                HostLogger.Shutdown();                throw;            }        }

     該方法用於配置新的服務主機,方法接受一個參數Action<HostConfigurator>配置方法調用,該方法返回Host對象,表示Topshelf服務主機,準備運行。 configureCallback.Method.DeclaringType;用於擷取聲明該成員的類。declaringType.Namespace;用於擷取擷取 System.Type 的命名空間。ValidateConfigurationResult.CompileResults(configurator.Validate());用於驗證配置結果。

   2.HostFactory.Run():

public static TopshelfExitCode Run(Action<HostConfigurator> configureCallback)        {            try            {                return New(configureCallback)                    .Run();            }            catch (Exception ex)            {                HostLogger.Get(typeof(HostFactory))                          .Error("The service terminated abnormally", ex);                HostLogger.Shutdown();                                return TopshelfExitCode.AbnormalExit;            }        }

     該方法是一個靜態方法,配置和運行新的服務主機,處理任何異常並將其寫入日誌。該方法接收一個參數Action<HostConfigurator> configureCallback配置方法調用,返回應用程式主方法返回的進程的結束代碼。

四.總結

   以上是介紹如何使用Topshelf組件建立簡單的Windows服務的方法,在這裡只是一個簡單的介紹,沒有很深入的介紹,如果需要瞭解更多的東西,可以看源碼,畢竟是開源免費的組件,也是一個很不錯的組件。

使用Topshelf組件構建簡單的Windows服務

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.