一、概述
目前測試了下面兩個項目,均可以部署為Windows服務運行。部署的方式

二、.NET Core部署Windows服務
1、項目中需要的配置
想要將.NET Core部署為window服務,項目中需要進行以下配置:項目中引入Microsoft.Extensions.Hosting.WindowsServices包

修改 Program.cs 文件,添加 UseWindowsService() 方法調用
using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Hosting; using System.Net; namespace XXService { public class Program { public static void Main(string[] args) { CreateHostBuilder(args).Build().Run(); } public static IHostBuilder CreateHostBuilder(string[] args) { return Host.CreateDefaultBuilder(args)//使用默認配置實例化Host主機 .UseWindowsService()//指定項目可以部署為Windows服務 .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>() .UseKestrel(options => { options.Listen(IPAddress.Any, 50003);//指定端口號,不然如果部署了多個服務,容易出現端口號占用 options.Limits.MaxRequestBodySize = null; }); ; }) .UseDefaultServiceProvider(options => options.ValidateScopes = false); } } }
2、服務器中使用sc.exe工具部署Windows服務
sc.exe是幫助開發部署 WindowsNT 服務的工具,路徑: C:\Windows\System32\sc.exe。
(1)將項目發布到服務器

(2)使用管理員權限運行PowerShell

(3)部署的相關命令:ServiceName 是自定義的服務名稱,可以自行修改
## 創建服務 sc.exe create ServiceName BinPath=C:\xx\ClearFontService\ClearFontService.exe ## 啟動服務 sc.exe start ServiceName ## 停止服務 sc.exe stop ServiceName ## 刪除服務 sc.exe delete ServiceName ## 添加服務描述 sc description ServiceName "描述" ## 改變服務的啟動方式 手動/自動/禁用 sc.exe config ServiceName start= demand/auto/disabled
(4)創建安裝腳本install.bat
set serviceName=ServiceName set serviceFilePath=C:\xx\ClearFontService\ClearFontService.exe set serviceDescription=服務描述 sc.exe create %serviceName% BinPath=%serviceFilePath% sc.exe config %serviceName% start=auto sc.exe description %serviceName% %serviceDescription% sc.exe start %serviceName% pause
(5)卸載服務腳本unstall.bat
set serviceName=ServiceName sc.exe stop %serviceName% sc.exe delete %serviceName% pause
使用管理員權限運行腳本
三、NetCore項目部署為Linux服務
環境:操作系統Centos 8 系統
1、安裝 .net core相關環境
注冊 Microsoft 密鑰和源:
sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm
安裝 .NET Core SDK:
sudo yum install aspnetcore-runtime-3.1
安裝完成之后驗證:
# 驗證dotnet core runtime是否安裝成功
dotnet --version
#查看系統中包含的.net core runtime版本
dotnet --list-runtimes
2、項目中需要的配置
項目中引入 Microsoft.Extensions.Hosting.Systemd包

修改 Program.cs 文件,添加 UseSystemd() 方法調用,可以和 UseWindowsService() 共存
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting; using System.Net; namespace ClearFontService { public class Program { public static void Main(string[] args) { CreateHostBuilder(args).Build().Run(); } public static IHostBuilder CreateHostBuilder(string[] args) { return Host.CreateDefaultBuilder(args)//使用默認配置實例化Host主機 .UseWindowsService() .UseSystemd() .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>() .UseKestrel(options => { options.Listen(IPAddress.Any, 50003); options.Limits.MaxRequestBodySize = null; }); ; }) .UseDefaultServiceProvider(options => options.ValidateScopes = false); } } }
然后把發布文件移至linux系統
3、部署服務
linux的服務是通過systemd守護進程部署的。現在在系統中我們有了一個發布后的應用程序,我們需要為systemd創建配置文件部署服務。步驟如下:
(1)創建一個.service文件(我們要部署服務,因此需要.service文件),填入以下內容。可以在Linux中直接創建或者通過windows創建然后拷貝至linux。
[Unit] Description= my test app [Service] Type=notify ExecStart=/usr/bin/dotnet /home/demo/WorkerService.dll [Install] WantedBy=multi-user.target
- Description:描述,看個人需要是否添加。不需要可以去掉。只留下 [Service] 和 [Install]
- Type=notify:當前服務啟動完畢,會通知S
ystemd,再繼續往下執行 - ExecStart:啟動當前服務的命令,程序如何啟動,第一個路徑是固定路徑。第二個路徑是應用程序的dll路徑(可以自定義)
- WantedBy:表示該服務所在的 Target服務組, multi-user.target,表示多用戶命令行狀態。
(2) .service文件移動至 /etc/systemd/system/ 固定目錄下,假設自定義文件名稱為:testapp.service(如果使用其他名稱,請更改testapp)

(3)使用systemctl命令重新加載新的配置文件
sudo systemctl daemon-reload
(4)查看相關服務狀態
sudo systemctl status testapp
您應該看到類似以下的內容:

(5)這表明您已注冊的新服務已禁用,我們可以通過運行以下命令來啟動我們的服務:
sudo systemctl start testapp.service
(6)重新運行 sudo systemctl status testapp 查看服務狀態顯示已激活正在運行中

(7)設置服務開機自啟
sudo systemctl enable testapp.service
到此我們的服務已經完整的部署到了linux系統中。
(8)現在我們有一個運行了systemd的應用程序,我們可以看看日志記錄集成。使用systemd的好處之一是可以使用journalctl訪問的集中式日志記錄系統。首先,我們可以使用journalctl(訪問日志的命令)查看服務日志:
sudo journalctl -u testapp

可以看到我們的程序正在運行,可以使用 ↑↓ ← →查看日志內容。或者使用grep搜索。q 鍵退出
(9)卸載自定義服務
servicename=testapp.service systemctl stop $servicename systemctl disable $servicename rm -rf /etc/systemd/system/$servicename rm -rf /etc/systemd/system/$servicename symlinks that might be related systemctl daemon-reload systemctl reset-failed
