一、概述

目前测试了下面两个项目,均可以部署为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:当前服务启动完毕,会通知Systemd,再继续往下执行
  • 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)重新运行sudosystemctl 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

到此这篇关于.NET Core部署为Windows服务的文章就介绍到这了,更多相关.NET Core部署Windows内容请搜索阿兔在线工具以前的文章或继续浏览下面的相关文章希望大家以后多多支持阿兔在线工具!

点赞(0)

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部