日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

使用.NET Core创建Windows服务(二) - 使用Topshelf方式

發布時間:2023/12/4 windows 58 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用.NET Core创建Windows服务(二) - 使用Topshelf方式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

原文:Creating Windows Services In .NET Core – Part 2 – The “Topshelf” Way

作者:Dotnet Core Tutorials

譯者:Lamond Lu

譯文:使用.NET Core創建Windows服務(二) - 使用Topshelf方式

使用.NET Core創建Windows服務

??使用Topshelf方式


在前一篇文章中,我給大家介紹了,如何基于微軟推薦方式使用.NET Core創建Windows服務。我們發現使用這種方式,我們很容易就可以搭建和運行一個Windows服務,但是問題是使用這種方式,代碼調試將非常困難。

那么現在就是Topshelf出場的時候了。Topshelf是一個.NET Standard庫,它消除了在.NET Framework和.NET Core中創建Windows服務的那些麻煩。

安裝

與微軟推薦方式類似,這里Visual Studio并沒有提供一個基于Topshelf創建Windows服務的模板,所以我們依然需要通過創建普通控制臺程序的方式,來創建一個Windows服務。

然后,我們需要通過Package Manager Console, 運行以下命令,安裝Topshelf類庫。

Install-Package Topshelf

代碼

下面我們就來使用Topshelf重構之前的服務代碼。

public class LoggingService : ServiceControl { private const string _logFileLocation = @"C:\temp\servicelog.txt"; private void Log(string logMessage) { Directory.CreateDirectory(Path.GetDirectoryName(_logFileLocation)); File.AppendAllText(_logFileLocation, DateTime.UtcNow.ToString() + " : " + logMessage + Environment.NewLine); } public bool Start(HostControl hostControl) { Log("Starting"); return true; } public bool Stop(HostControl hostControl) { Log("Stopping"); return true; } }

代碼看起來是不是很簡單?

這里我們的服務類繼承了ServiceControl類(實際上并不需要,但是這可以為我們的工作打下良好的基礎)。我們必須實現服務開始和服務結束兩個方法,并且像以前一樣記錄日志。

在Program.cs文件的Main方法中,我們要寫的代碼也非常的簡單。我們可以直接使用HostFactory.Run方法來啟動服務。

static void Main(string[] args) { HostFactory.Run(x => x.Service<LoggingService>()); }

這看起來真是太簡單了。但這并不是HostFactory類的唯一功能。這里我們還可以設置

?服務的名稱?服務是否自動啟動?服務崩潰之后的重啟時間

static void Main(string[] args) { HostFactory.Run(x => { x.Service<LoggingService>(); x.EnableServiceRecovery(r => r.RestartService(TimeSpan.FromSeconds(10))); x.SetServiceName("TestService"); x.StartAutomatically(); } ); }

這里其實能說的東西很多,但是我建議你還是自己去看看Topshelf的文檔,學習一下其他的配置選項。基本上你能使用Windows命令行完成的所有操作,都可以使用代碼來設置:https://topshelf.readthedocs.io/en/latest/configuration/config_api.html

部署服務

和之前一樣,我們需要針對不同的Windows環境發布我們的服務。在Windows命令提示符下,我們可以在項目目錄中執行以下命令:

dotnet publish -r win-x64 -c Release

現在我們就可以查看一下bin\Release\netcoreappX.X\win-x64\publish目錄,我們會發現一個編譯好的exe,下面我們就會使用這個文件來安裝服務。

在上一篇文章中,我們是使用SC命令來安裝Windows服務的。使用Topshelf我們就不需要這么做了,Topshelf提供了自己的命令行參數來安裝服務。基本上使用代碼能完成的配置,都可以使用命令行來完成。

你可以查看相關的文檔:

http://docs.topshelf-project.com/en/latest/overview/commandline.html

WindowsServiceExample.exe install

這里WindowsServiceExample.exe是我發布之后的exe文件。運行以上命令之后,服務應該就正常安裝了!這里有一個小問題,我經常發現,即使配置了服務自動啟動,但是服務安裝之后,并不會觸發啟動操作。所有在服務安裝之后,我們還需要通過以下命令來啟動服務。

WindowsServiceExample.exe start

在生產環境部署的時候,我的經驗是在安裝服務之后,等待10秒鐘,再啟動服務。

調試服務

當我們是使用微軟推薦方式的時候,我們會遇到了調試困難的問題。大多數情況下,無論是否在服務內部運行,我們都不得不使用命令行標志、#IF DEBUG指令或者配置值來實現調試。然后使用Hack的方式在控制臺程序中模擬服務。

因此,這就是為什么我們要使用Topshelf。

如果我們的服務代碼已經在Visual Studio中打開了,我們就可以直接啟動調試。Topshelf會模擬在控制臺中啟動服務。我們應該能在控制臺中看到以下的消息。

The TestService service is now running, press Control+C to exit.

這確實符合了我們的需求。它啟動了我們的服務,并像真正的Windows服務一樣在后臺運行。我們可以像往常一樣設置斷點,基本上它遵循的流程和正常安裝的服務一樣。

我們可以通過ctrl+c, 來關閉我們的應用,但是在運行服務執行Stop方法之前,它是不能被關閉的,這使我們可以調試服務的關閉流程。與調試指令和配置標志相比,這要容易的多。

這里需要注意一個問題。如果你收到的以下內容的消息:

The TestService service is running and must be stopped before running via the console

這意味著你嘗試調試的服務實際上已經作為Windows服務被安裝在系統中了,你需要停止(不需要卸載)這個正在運行的服務,才可以正常調試。

后續

在上一篇中,有讀者指出.NET Core中實際上已經提供了一種完全不同的方式運行Windows服務。它的實質是利用了ASP.NET Core中引入的“托管服務”模型,并允許它們作為Windows服務來運行,這真的是非常的棒。

References

[1]?使用微軟推薦方式:?https://www.cnblogs.com/lwqlun/p/11621186.html

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的使用.NET Core创建Windows服务(二) - 使用Topshelf方式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。