今天淘到了一个非常棒的.NET服务自宿主框架,名叫ServiceSelf。能够完美替代Topshelf,让我的.NET项目飞得更高!
英雄迟暮的Topshelf
用过.NET开发Windows服务的朋友,应该都知道Topshelf吧。Topshelf是一个开源的跨平台的宿主服务框架,支持Windows和Mono,只需要几行代码就可以构建一个很方便使用的服务宿主。
多年前,仍是在.NET Framework 4.X的占据主流的时代,Topshelf出现确实令我眼前一亮,完美解决了用.NET 开发Windows Service项目Debug非常不方便的问题,并且安装部署应用也简单轻松了许多。然而,到了.NET Core的时代Topshelf明显掉队了,4年已经停更了整整四年。在新的.NET框架的支持上,勉强能够跑在.NET Core3.1上,再往上便无能为力了。
完美的替代方案ServiceSelf
今天,我仍然抱有一丝侥幸,再次把一个构建在.NET Core3.1的TopShelf上的Windows服务应用升级到.NET6.0。但遗憾的是,升级后的服务应用并没能如愿跑起来。我还是很希望我的项目不掉队,毕竟.NET Core 3.1已经停更了一年多了。
在GIthub翻找一轮后,皇天不服有心人,终于在上找到了一个完美的替代方案——ServiceSelf。简单整合后,我的应用终于可以成功地在.NET6.0 上运行了!
ServiceSelf的实战案例
1、Nuget引入
nuget包地址: https://www.nuget.org/packages/ServiceSelf/,我们也可以选择直接在.csproj文件配置:
<ItemGroup>
<PackageReference Include="ServiceSelf" Version="1.0.6" />
</ItemGroup>
2、代码编写
internal class Program
{
static void Main(string[] args)
{
var serviceName = "MyTestService";
var serviceOptions = new ServiceOptions
{
Description = "ServiceSelf Testing Service",
};
serviceOptions.Linux.Service.Restart = "always";
serviceOptions.Linux.Service.RestartSec = "10";
serviceOptions.Windows.DisplayName = "MyServiceSelfTest";
serviceOptions.Windows.FailureActionType = WindowsServiceActionType.Restart;
if (Service.UseServiceSelf(args, serviceName, serviceOptions))
{
var builder = new HostBuilder()
.ConfigureServices((hostContext, services) =>
{
services.AddHttpClient();
services.AddHostedService<HostApp>();
});
builder.UseServiceSelf();
var app = builder.Build();
app.Run();
}
}
}
internal class HostApp: BackgroundService
{
private Timer _timer;
protected override Task ExecuteAsync(CancellationToken stoppingToken)
{
_timer = new Timer(OnTimerTick, null, TimeSpan.FromSeconds(30), TimeSpan.FromSeconds(10));
return Task.CompletedTask;
}
private void OnTimerTick(object state)
{
Console.WriteLine(DateTime.Now.ToString());
}
}
3、调试运行
- 直接控制台运行
TestServiceSelf.exe
4、服务启动停止
windows
TestServiceSelf.exe start // install and start service
TestServiceSelf.exe stop // stop and uninstall service
linux
sudo ./TestServiceSelf start // install and start service
sudo ./TestServiceSelf stop // stop and uninstall service