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

歡迎訪問 生活随笔!

生活随笔

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

windows

使用.NET Core创建Windows服务(一) - 使用官方推荐方式

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

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

創建Windows服務來運行批處理任務或者運行后臺任務,是一種非常常見的模式,但是由于云服務(Amazon Lambda, Azure WebJobs以及Azure Functions)的激增,你可能不會經常使用Windows服務了。個人而言,我非常喜歡使用Azure WebJobs, 因為我可以直接編寫一個控制臺程序,而不需要考慮如何云中運行它,一個批處理文件可以將其裝換成一個自動化任務,并且可以保證7*24小時的運行。

但是也許你還沒有使用云服務,或者你有一堆要作為Windows服務運行的舊版應用程序需要轉換為.NET Core, 但是不能完全將他們轉換為“無服務器”(serverless)應用。那么這邊文章就是適合你的。

在許多方面,.NET Core中的Windows服務和.NET Framework中的Windows服務完全相同。但是,在編寫服務的時候,你可能會遇到一些小問題。此外,本文中,我們僅介紹“Microsoft”方式的Windows服務創建,在后續,我會繼續介紹如何使用第三方庫TopShelf來簡化這該過程。

由于Visual Studio沒有提供創建Windows服務的模板,所以我們需要通過創建控制臺程序的方式來創建一個Windows服務。

創建完成之后,我們需要安裝一個Nuget程序包,這個程序包會將一些Windows特定的API添加到.NET Core中,這些API實際上已經在完整框架中提供了,但是其中許多是Windows特有的,例如Windows服務。因此, 它們并沒有包含在.NET Core的基礎庫中,但是可以通過將Nuget程序包的方式引入到.NET Core中。

Install-Package Microsoft.Windows.Compatibility

以上引入的Nuget程序包中,最讓我們感興趣的是ServiceBase類。這是一個用于編寫Windows服務的基類,它提供了一系列的事件鉤子,包含服務啟動、結束、暫停等。

下面呢,我們將在代碼中創建一個類,這個類負責將一些簡單的日志輸出到一個臨時文件中。我們將使用這個例子來了解其中的原理。我們的代碼如下:

class LoggingService : ServiceBase {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);}protected override void OnStart(string[] args){Log("Starting");base.OnStart(args);}protected override void OnStop(){Log("Stopping");base.OnStop();}protected override void OnPause(){Log("Pausing");base.OnPause();} }

所以這里你會注意到,我們的類是繼承了ServiceBase類,并且我們重寫了幾個事件方法,輸出了一些日志。在服務啟動時,會觸發OnStart事件,在服務終止的時候,會觸發OnStop事件。這里我們不應該將過于繁重的任務放置在OnStart事件中來處理。

如果我們想從Main方式中啟動這個服務,代碼非常的簡單。

static void Main(string[] args) {ServiceBase.Run(new LoggingService()); }

以上就是全部代碼。

在發布服務的時候,我們不可能僅依靠Visual Studio來構建我們所需要的服務,我們還需要專門針對Windows運行時進行構建。為此,我們需要在項目根目錄的命令提示符下運行以下命令。注意,這里我們傳入了一個-r標記來告訴它要構建那個平臺。

dotnet publish -r win-x64 -c Release

命令運行完畢之后,我們可以檢查以下/bin/release/netcoreappX.X/publish目錄,我們可以找到所有的發布代碼,但是最重要的是,這里我們可以得到一個可執行的exe文件。如果我們不指定運行時,我們只會獲得一個.NET Core的dll程序集,使用這個程序集,我們是沒有辦法創建Windows服務的。

現在我們可以將這個發布目錄移動帶其他的任何地方,但是現在我們就暫時使用當前的發布目錄。

下一步,我們需要使用管理員角色打開一個命令提示符,然后輸入一下命令。

sc create TestService BinPath=C:\full\path\to\publish\dir\WindowsServiceExample.exe

SC命令是一個標準的Windows命令(與.NET Core無關),它可以用來安裝Windows服務。這里我們將我們的測試服務命名為TestService,更重要的是,我們通過BinPath參數指定了可執行exe文件。

運行之后,我們應該會得到以下結果。

[SC] CreateService SUCCESS

然后我們要做的就是啟動服務。

sc start TestService

現在我們可以查看一下我們的日志文件,查看服務的運行情況。

如果想要停止并刪除服務,我們可以使用一下命令。

sc stop TestService sc delete TestService

在這里,我真的認為,使用"Microsoft"的方式注定會失敗。因為調試服務實在是太繁瑣了。

首先,我們將ServiceBase中重寫的方法設置為受保護,這意味著我們無法在類之外訪問它們,這使得調試它們變得更加困難。這里我發現最好的方法是為每個事件提供一個public方法, 并在受保護方法中調用這些public方法來完成功能,這雖然有點混亂,

public void OnStartPublic(string[] args) {Log("Starting"); }protected override void OnStart(string[] args) {OnStartPublic(args);base.OnStart(args); }

但是至少我們可以做如下了事情了。

static void Main(string[] args) {var loggingService = new LoggingService();if (true){loggingService.OnStartPublic(new string[0]);while(true){Thread.Sleep(1000);}}else{ServiceBase.Run(new LoggingService());} }

你的另一個選擇是,在調試模式下進行項目發布,安裝服務,然后附加調試器。實際上,這是Microsoft建議你使用的方式,但是我認為這簡直一團糟。

實際上,我們可以在這里做一些其他非常有用的事情, 比如我們可以通過創建一個install.bat批處理文件來為我們運行SC Create命令。但我認為,上面我們看到的調試問題,已經讓我不再想使用這種方式了。幸運的是,有一個名為Topshelf的庫可以幫助我們減輕很多麻煩,在本系列的下一部分中,我們將研究如何它。

總結

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

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