前言,為什么會分別在兩個框架下編寫Windows Service,是因為最近在做區塊鏈這塊,使用的是NEO(小蟻區塊鏈)的相關技術,NEO使用的是.net core 2.1,業務上需要寫兩個程序,一個同步數據到本地,一個保持對鏈上數據的訪問。之前一直是用的控制台,但是部署后容易誤操作,關閉之類的(實際上一開始就該想到的),所以需要改成windows服務。就用.NET Framework 和.NET Core都試了一下。
IDE:vs2017
.NET Framework 下編寫Windows Service
1、創建項目
2、將Service1改名為自己的名稱BlockSyncService,並編寫自己的程序
3、設置WindowsService的屬性
定位到BlockSyncService頁面,並查看代碼,在OnSatrt()與OnStop()方法中寫入對應服務啟動與停止的代碼。
4、回到BlockSyncService設計頁面,右鍵空白處選擇“添加安裝程序”
5、右鍵serviceProcessInstaller1選擇屬性,設置Account(賬戶)為LocalSystem;
右鍵serviceinstaller1選擇屬性,設置Description(對部署服務的描述)、ServiceName(部署服務的名稱)、StartType(服務的啟動方式(自啟動-Automatic,手動啟動-Manual,禁止啟動-Disabled等))
設置完后重新生成解決方案。
6、部署服務
以管理員身份運行cmd,輸入命令 sc create 服務名稱 binPath="程序exe文件的路徑" 用於創建服務
注意:出現“[SC] OpenSCManager 失敗 5:拒絕訪問。” 的錯誤提示,請使用管理員身份打開命令提示符(cmd)
若沒有設置啟動方式,也可再輸入命令 sc config BlockSyncService start="AUTO" 用於配置服務的啟動方式(AUTO-自啟動)
配置成功后,輸入 net start BlockSyncService 啟動服務即可。
7、服務調試
WindowsService 無法直接調試,只能在已經啟動服務的情況下,通過附加到進程,從而進行調試。如下圖
勾選“顯示所有用戶”
選擇自己的服務進程,並附加
注意:附加到進程是無法調試OnStart()方法的,一般情況下可以把OnStart()中的代碼放到OnStop()中執行並調試。調試相對比較麻煩。
最后,win+r 並輸入 swevices.msc 進入服務管理界面,右鍵停止即可觸發調試。
.NET Core下編寫Windows Service
1、創建一個.net core 控制台項目
2、添加WindowsService項
創建后,會提示錯誤。這是因為,沒有命名空間“System.ServiceProcess.ServiceController”,需要nuget安裝。
3、編寫自己的程序,設置SBS-RPC-Service.cs中的OnStart()和OnStop(),最后設置Program.cs,重新生成代碼。
調試與部署步驟與.NET Framework 的步驟基本一致,只是.net core 需要先發布,在創建服務時 binPath=“發布的.exe程序的路徑”,其他的並無區別,這里就不再重復說了。
順便附一下官方的在 Windows 服務中托管 ASP.NET Core的文檔:https://docs.microsoft.com/zh-cn/aspnet/core/host-and-deploy/windows-service?view=aspnetcore-2.1