.NET环境下使用ServiceSelf框架开发Windows服务应用,完美替代Topshelf

时间:01/11/2024 19:59:27   作者:ChenReal    阅读:67

今天淘到了一个非常棒的.NET服务自宿主框架,名叫ServiceSelf。能够完美替代Topshelf,让我的.NET项目飞得更高!

英雄迟暮的Topshelf

用过.NET开发Windows服务的朋友,应该都知道Topshelf吧。Topshelf是一个开源的跨平台的宿主服务框架,支持Windows和Mono,只需要几行代码就可以构建一个很方便使用的服务宿主。

https://github.com/topshelf/Topshelf

多年前,仍是在.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 上运行了!

https://github.com/xljiulang/ServiceSelf

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

serviceself-1.png

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
    

 

评论
0/200