因为.net 已经内置了Kestrel服务器,很多时候我们直接采用Kestrel作为服务器即可。但是在windows下,点击.net项目会运行cmd窗口,关闭cmd窗口则.net项目也随之关闭,这时候就需要将.net项目作为服务运行在系统中,或者在linux下作为守护进程运行在系统中。在 Windows 上快速部署.NET Core Web 项目 这篇文章已经讲了使用WinSW或者NSSM将.net作为服务来使用,今天讲解一种更简单的方法,使用ServiceSelf框架。
ServiceSelf为.NET 泛型主机的应用程序提供自安装为服务进程的能力,支持windows和linux平台,支持:
使用方式 引入nuget包ServiceSelf
2. 使用非常简单,两个管件步骤,在创建Host之前调用Service.UseServiceSelf(args)
,并为Host配置UseServiceSelf()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 static void Main (string [] args ){ if (Service.UseServiceSelf(args)) { var builder = WebApplication.CreateBuilder(args); builder.Host.UseServiceSelf(); var app = builder.Build(); app.MapGet("/" , context => context.Response.WriteAsync("ServiceSelf" )); app.Run(); } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 public static void Main (string [] args ){ var service = "mydotnetservice" ; var serviceOptions = new ServiceOptions() { Arguments = new [] { new Argument("key" , "value" ) }, Description = "My Dotnet Service" }; serviceOptions.Windows.DisplayName = "My Dotnet Service" ; serviceOptions.Windows.FailureActionType = WindowsServiceActionType.Restart; serviceOptions.Linux.Service.Restart = "always" ; serviceOptions.Linux.Service.RestartSec = "10" ; if (!Service.UseServiceSelf(args, service, serviceOptions)) return ; var builder = WebApplication.CreateBuilder(args); builder.Host.UseServiceSelf(); var app = builder.Build(); app.Logger.LogInformation("Service is running" ); app.MapGet("/" , () => { app.Logger.LogInformation("返回请求" ); return "Hello World!" ; }); app.Run(); }
服务控制 必须使用root或者管理员模式
1 2 3 4 yourapp.exe start // 安装并启动服务 yourapp.exe stop // 停止并删除服务 yourapp.exe logs // 控制台输出服务的日志 yourapp.exe logs filter="key words" // 控制台输出服务的日志
1 2 3 4 sudo ./yourapp start // 安装并启动服务 sudo ./yourapp stop // 停止并删除服务 sudo ./yourapp logs // 控制台输出服务的日志 sudo ./yourapp logs filter="key words" // 控制台输出服务的日志