C# 开发 Windows 服务程序最简单的方式-Topshelf

栏目: ASP.NET · 发布时间: 5年前

内容简介:一直以来,我都在追求以最简单的方式写程序。这里的最简单是指利用强大的工具。这种想法主要来源于三年前我服务过的一个客户。他们的IT经理就一直在部门内部强调“你所想到的,别人都想已经想到而且做到了,学会寻找比学会创造更加重要。”这种话虽略显极端,但在程序这个领域里却有着重要意义。像很多知名的开源软件,都是无数人智慧的结晶。扯远了~本文写作的目的是,记录一种最简单开发 Windows 服务的方式– Topshelf 。使用前先下载依赖文件: Topshelf.dll

一、概述

一直以来,我都在追求以最简单的方式写程序。这里的最简单是指利用强大的工具。

这种想法主要来源于三年前我服务过的一个客户。他们的IT经理就一直在部门内部强调“你所想到的,别人都想已经想到而且做到了,学会寻找比学会创造更加重要。”这种话虽略显极端,但在程序这个领域里却有着重要意义。像很多知名的开源软件,都是无数人智慧的结晶。扯远了~

本文写作的目的是,记录一种最简单开发 Windows 服务的方式– Topshelf 。使用前先下载依赖文件: Topshelf.dll Topshelf.4.2.0.zip 或者直接通过 Nuget 安装:Install-Package Topshelf

Topshelf 官方网站: http://topshelf-project.com/

Topshelf 文档地址: https://topshelf.readthedocs.io/en/latest/index.html

二、程序实例

C# 直接创建控制台项目,覆盖 Program.cs 文件为如下代码:

using System;
using System.Timers;
using Topshelf;

namespace TopshelfDemo
{
    public class TownCrier
    {
        readonly Timer _timer;
        public TownCrier()
        {
            _timer = new Timer(1000) { AutoReset = true };//1秒执行一次
            _timer.Elapsed += (sender, eventArgs) => Console.WriteLine("It is {0} and all is well", DateTime.Now);
        }
        public void Start() { _timer.Start(); }
        public void Stop() { _timer.Stop(); }
    }

    public class Program
    {
        public static void Main()
        {
            var rc = HostFactory.Run(x =>
            {
                x.Service<TownCrier>(s =>
                {
                    s.ConstructUsing(name => new TownCrier());
                    s.WhenStarted(tc => tc.Start());
                    s.WhenStopped(tc => tc.Stop());
                });
                x.RunAsLocalSystem(); //服务器使用内置账户运行

                x.SetDescription("Sample Topshelf Host");//服务的描述信息
                x.SetDisplayName("Stuff");//服务的显示名称
                x.SetServiceName("Stuff");//服务的名称(最好不要包含空格或者有空格属性的字符)。Windows 服务名称不能重复。
                //x.SetInstanceName("MyService");//实例名称:主要用于命令行部署多实例时进行区分。效果是:Stuff$MyService
            });

            var exitCode = (int)Convert.ChangeType(rc, rc.GetTypeCode());
            Environment.ExitCode = exitCode;
        }
    }
}

这段代码就是 Topshelf 官网文档中的实例代码。

直接启用运行,效果如下。每秒输出一条语句。到这里实现输出的字符串的 Windows 服务程序就开发完成了。

C# 开发 Windows 服务程序最简单的方式-Topshelf

下面看如何安装、运行、停止和卸载服务。

1. 程序安装:

假设运行程序存放到以下路径:

C# 开发 Windows 服务程序最简单的方式-Topshelf

用管理员方式打开命令行窗口,在 exe 所在路径下执行:TopshelfDemo.exe install 安装服务。

C# 开发 Windows 服务程序最简单的方式-Topshelf

在服务窗口中可以查看到安装完成的服务。

命令行窗口中会涉及到的命令(以程序 server.exe 举例,自行替换):

  • 安装服务 server.exe install
  • 启动服务 server.exe start
  • 停止服务 server.exe stop
  • 卸载服务 server.exe uninstall

C# 开发 Windows 服务程序最简单的方式-Topshelf

2. 注意事项

这里要注意:必须使用管理员方式运行命令行窗口!!否则会提示错误信息:The Stuff service can only be installed as an administrator

C# 开发 Windows 服务程序最简单的方式-Topshelf

到这里为止,开发及安装 Windows 服务已经完成了!下面介绍写自定义设置,可看可不看。

三、Topshelf 自定义项说明

1. 服务的启动模式

可以指定多种服务的启动模式,这些选项只在服务安装后有效。

HostFactory.New(x =>
{
    x.StartAutomatically(); // 服务自动启动
    x.StartAutomaticallyDelayed(); // 服务自动启动(延时启动) -- 需要 .NET 4.0 或以上版本
    x.StartManually(); // 手动启动服务
    x.Disabled(); // 服务禁用状态
});

2. 指定服务运行的身份

HostFactory.New(x =>
{
    x.RunAs("username", "password");//使用指定用户名和密码运行服务,用户名中包含域:domain\username 或者 username@suffix.com
    //x.RunAsPrompt();//安装服务时,提示输入用户名和密码用于启动服务
    //x.RunAsNetworkService();//使用内置的 NETWORK_SERVICE 账户运行服务
    //x.RunAsLocalSystem();//使用本地系统账户运行
    //x.RunAsLocalService();//使用本地服务账户运行
});

3. 自定义安装或卸载时执行的动作

这些操作允许在服务安装或卸载的过程中执行用户指定的方法。这里需要特别注意,一定是服务安装或卸载时有效!方法中可以使用服务的实例名称、服务名称等。

HostFactory.New(x =>
{
    x.BeforeInstall(settings => { ... });//安装服务前执行
    x.AfterInstall(settings => { ... });//安装服务后执行
    x.BeforeUninstall(() => { ... });//卸载服务前执行
    x.AfterUninstall(() => { ... });//卸载服务后执行
});

4. 指定依赖的服务

可以指定服务依赖项,以便在依赖服务启动之前不会启动服务。这是由 windows 服务控制管理器管理的,而不是由 Topshelf 本身管理的。

HostFactory.New(x =>
{
    x.DependsOn("SomeOtherService");
});

//对于知名的服务,有很多内置的扩展方法,包括:
HostFactory.New(x =>
{
    x.DependsOnMsmq(); // Microsoft Message Queueing
    x.DependsOnMsSql(); // Microsoft SQL Server
    x.DependsOnEventLog(); // Windows Event Log
    x.DependsOnIis(); // Internet Information Server
});

5. 支持服务管理器暂停、继续、关闭等

HostFactory.New(x =>
{
    x.EnablePauseAndContinue();//允许服务控制管理器向服务传递暂停和继续命令
    x.EnableShutdown();//允许服务控制管理器快速关闭服务
    x.OnException(ex =>
    {
        //此功能为服务运行时引发的异常提供回调。此回调不是处理程序,也不会影响 Topshelf 已经提供的默认异常处理程序
        //它旨在为触发外部操作如异常记录等
    });
});

6. 服务恢复选项

HostFactory.New(x =>
{
    x.EnableServiceRecovery(r =>
    {
        //恢复操作按指定的顺序执行,上一个操作运行后执行下一个操作
        //可以执行多少个操作是有限制的 (基于操作系统),通常是 2-3 个操作。
        r.RestartComputer(5, "message");
        r.RestartService(1); // 1分钟后重启服务
        //因为最多执行3个操作,最后一个将会执行后续所有的失败
        r.RunProgram(7, "ping google.com");// 运行程序,例如 notepad.exe
        r.SetResetPeriod(1); // 将重置间隔设置为一天
    });
});

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Search User Interfaces

Search User Interfaces

Marti A. Hearst / Cambridge University Press / 2009-9-21 / USD 59.00

搜索引擎的本质是帮助用户更快、更方便、更有效地查找与获取所需信息。在不断改进搜索算法和提升性能(以技术为中心)的同时,关注用户的信息需求、搜寻行为、界面设计与交互模式是以用户为中心的一条并行发展思路。创新的搜索界面及其配套的交互机制对一项搜索服务的成功来说是至关重要的。Marti Hearst教授带来的这本新作《Search User Interfaces》即是后一条思路的研究成果,将信息检索与人......一起来看看 《Search User Interfaces》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

在线进制转换器
在线进制转换器

各进制数互转换器

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换