当前位置:网站首页 / 综合 / 正文

AY C#技术学习路线 - topshelf服务

时间:2017年11月08日 | 作者 : aaronyang | 分类 : 综合 | 浏览: 737次 | 评论 0

AY:写C# 可以新建window service项目,但是不方便调试,于是,我们可以用控制台去开发,然后自己移植代码到服务去,开发和部署 window服务,其实

topshelf更方便,接下来我们来学习。

新建控制台项目 AyNotice服务

====================www.ayjs.net       杨洋    wpfui.com        ayui      ay  aaronyang=======请不要转载谢谢了。=========

1、官网:http://topshelf-project.com/  这里面有详细的文档及下载

2、Topshelf的代码托管在 http://github.com/topshelf/Topshelf/downloads   ,可以在这里下载到最新的代码。

blob.png我用的3.0.2的,作者貌似2012年更新的。

控制台引用Topshelf.dll和 Topshelf.NLog.dll

放入代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Timers;
using Topshelf;

namespace AyNotice
{
    public class AyNoticeTimer
    {
        readonly Timer _timer;
        public AyNoticeTimer()
        {
            _timer = new Timer(1000) { AutoReset = true };
            _timer.Elapsed += (sender, eventArgs) => Console.WriteLine("AY: 现在 {0} ", DateTime.Now);
        }
        public void Start() { _timer.Start(); }
        public void Stop() { _timer.Stop(); }
    }

    class Program
    {
        static void Main(string[] args)
        {
            HostFactory.Run(x =>                                 //1
            {
                x.Service<AyNoticeTimer>(s =>                        //2
                {
                    s.ConstructUsing(name => new AyNoticeTimer());     //3
                    s.WhenStarted(tc => tc.Start());              //4
                    s.WhenStopped(tc => tc.Stop());               //5
                });
                x.RunAsLocalSystem();                            //6

                x.SetDescription("AY第一个TopShelf宿主");        //7
                x.SetDisplayName("AyNotice");                       //8
                x.SetServiceName("AyNotice");                       //9
            });

        }
    }
}

F5跑起来

blob.png

接下来,只需要简单配置一下,即可以当服务来使用了。安装很方便:

安装 G:\正在研究整合\AyNotice\AyNotice\bin\Debug\AyNotice.exe install

blob.png

提示,你必须  管理员方式的cmd 执行,我管理员 powershell一样的。

blob.png

cmd输入services.msc回车,打开服务窗口查看。这样一个控制台就变成服务了。

blob.png


启动 G:\正在研究整合\AyNotice\AyNotice\bin\Debug\AyNotice.exe start

卸载  G:\正在研究整合\AyNotice\AyNotice\bin\Debug\AyNotice.exe uninstall


官方文档,对HostFactory 里面的参数做了详细的说明: ,下面只对一些常用的方法进行简单的解释:

blob.png

两种使用模式

1 简单模式。继承ServiceControl接口,实现该接口即可。

下载并引用了 2.0.8的log4net 

我去掉了TopShelf.Nlog那个dll了,换成

blob.png

新建log的配置: Log4Net.xml

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <log4net>
    <root>
      <level value="WARN" />
      <appender-ref ref="LogFileAppender" />
      <appender-ref ref="ConsoleAppender" />
    </root>
    <logger name="testApp.Logging">
      <level value="DEBUG"/>
    </logger>
    <appender name="LogFileAppender" type="log4net.Appender.FileAppender" >
      <param name="File" value="log-file.txt" />
      <param name="AppendToFile" value="true" />
      <layout type="log4net.Layout.PatternLayout">
        <param name="Header" value="[Header] "/>
        <param name="Footer" value="[Footer] "/>
        <param name="ConversionPattern" value="%d [%t] %-5p %c [%x]  - %m%n" />
      </layout>

      <filter type="log4net.Filter.LevelRangeFilter">
        <param name="LevelMin" value="DEBUG" />
        <param name="LevelMax" value="WARN" />
      </filter>
    </appender>

    <appender name="ConsoleAppender"  type="log4net.Appender.ConsoleAppender" >
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern"  value="%d [%t] %-5p %c [%x] - %m%n" />
      </layout>
    </appender>

  </log4net>
</configuration>

修改客户端代码:

 public class AyNoticeTimer : ServiceControl
    {
        private Timer _timer = null;
        readonly ILog _log = log4net.LogManager.GetLogger("testApp.Logging");//获取一个日志记录器
        //readonly ILog _log = LogManager.GetLogger(typeof(AyNoticeTimer));
        public AyNoticeTimer()
        {
            _timer = new Timer(1000) { AutoReset = true };
            _timer.Elapsed += (sender, eventArgs) =>
            {
                _log.Info(DateTime.Now);

            };

        }
        public bool Start(HostControl hostControl)
        {
            _log.Info("Topshelf Demo 运行中...");
            _timer.Start();
            return true;
        }

        public bool Stop(HostControl hostControl)
        {
            _log.Info("Topshelf Demo 结束");
            _timer.Stop();
            return true;
        }
    }
    class Program
    {
        public static void Main(string[] args)
        {
            var logCfg = new FileInfo(AppDomain.CurrentDomain.BaseDirectory + "Log4Net.xml");
            XmlConfigurator.ConfigureAndWatch(logCfg);

            HostFactory.Run(x =>
            {
                x.Service<AyNoticeTimer>();
                x.RunAsLocalSystem();
                 x.SetDescription("AY第一个TopShelf宿主");        //7  /安装服务后,服务的描述
                 x.SetDisplayName("AyNotice");                       //8 显示名称
                 x.SetServiceName("AyNotice");                       //9 服务名称

            });
        }
    }

F5运行后,会生成日志文件,说明代码对的,当然,也可以注册为服务。

blob.png


第二种方式

Custom Service   就是我们一开始写的那种写法,不继承

我更换了log4net的配置

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
  </configSections>

  <log4net>
    <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
      <!--日志路径-->
      <param name= "File" value= "servicelog\"/>
      <!--是否是向文件中追加日志-->
      <param name= "AppendToFile" value= "true"/>
      <!--log保留天数-->
      <param name= "MaxSizeRollBackups" value= "10"/>
      <!--日志文件名是否是固定不变的-->
      <param name= "StaticLogFileName" value= "false"/>
      <!--日志文件名格式为:2008-08-31.log-->
      <param name= "DatePattern" value= "yyyy-MM-dd&quot;.log&quot;"/>
      <!--日志根据日期滚动-->
      <param name= "RollingStyle" value= "Date"/>
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n %loggername" />
      </layout>
    </appender>

    <!-- 控制台前台显示日志 -->
    <appender name="ColoredConsoleAppender" type="log4net.Appender.ColoredConsoleAppender">
      <mapping>
        <level value="ERROR" />
        <foreColor value="Red, HighIntensity" />
      </mapping>
      <mapping>
        <level value="Info" />
        <foreColor value="Green" />
      </mapping>
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%n%date{HH:mm:ss,fff} [%-5level] %m" />
      </layout>

      <filter type="log4net.Filter.LevelRangeFilter">
        <param name="LevelMin" value="Info" />
        <param name="LevelMax" value="Fatal" />
      </filter>
    </appender>

    <root>
      <!--(高) OFF > FATAL > ERROR > WARN > INFO > DEBUG > ALL (低) -->
      <level value="all" />
      <appender-ref ref="ColoredConsoleAppender"/>
      <appender-ref ref="RollingLogFileAppender"/>
    </root>
  </log4net>
</configuration>

修改第一次写的代码

 public class AyNoticeTimer
    {
        readonly Timer _timer;
        readonly ILog _log = LogManager.GetLogger(
                                      typeof(AyNoticeTimer));
        public AyNoticeTimer()
        {
            _timer = new Timer(1000) { AutoReset = true };
            _timer.Elapsed += (sender, eventArgs) => _log.Info("AY: 现在 "+DateTime.Now) ;
        }
        public void Start() { _timer.Start(); }
        public void Stop() { _timer.Stop(); }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var logCfg = new FileInfo(AppDomain.CurrentDomain.BaseDirectory + "Log4Net.xml");
            XmlConfigurator.ConfigureAndWatch(logCfg);

            HostFactory.Run(x =>                                 //1
            {
                x.Service<AyNoticeTimer>(s =>                        //2 配置一个完全定制的服务,对Topshelf没有依赖关系。常用的方式。
                {
                    s.ConstructUsing(name => new AyNoticeTimer());     //3
                    s.WhenStarted(tc => tc.Start());              //4
                    s.WhenStopped(tc => tc.Stop());               //5
                });
                x.RunAsLocalSystem();                            //6 服务使用NETWORK_SERVICE内置帐户运行。身份标识,有好几种方式,
                                                                 // 如:x.RunAs("username", "password");  x.RunAsPrompt(); x.RunAsNetworkService(); 等

                x.SetDescription("AY第一个TopShelf宿主");        //7  /安装服务后,服务的描述
                x.SetDisplayName("AyNotice");                       //8 显示名称
                x.SetServiceName("AyNotice");                       //9 服务名称
            });

        }
    }

blob.png

blob.png




有了这个东西,控制台也可以变成服务了,比以前windowservice好多了。

====================www.ayjs.net       杨洋    wpfui.com        ayui      ay  aaronyang=======请不要转载谢谢了。=========







推荐您阅读更多有关于“”的文章

猜你喜欢

额 本文暂时没人评论 来添加一个吧

发表评论

必填

选填

选填

必填

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

  查看权限

作者:杨洋(AaronYang简称AY,安徽六安人)目前是个人,还没成立公司AY唯一QQ:875556003和AY交流

高中学历,2015年1月17日开始,兴趣学习研究WPF

声明:AYUI个人与商用免费,源码可购买。部分DEMO不免费

查看捐赠

AYUI7.X MVC教程 更新如下:

第一课 第二课 程序加密教程

兼容XP到win10,vs2015/2017,最新AYUI:7.6.2.8

一次购买,永久免费更新,bug反馈及时修复,普通话回答你的问题,3个月的技术支持

AYUI7.6.X 企业服务详情:680元

AYUI7.6.X 官方风格详情:4000元

AYUI7.6.X 医疗+官方风格详情5000元

本AYUI知识版权最终归杨洋(AY)所有

本AYUI最终销售权归杨洋(AY)所有

vs2015 企业版密钥HM6NR-QXX7C-DFW2Y-8B82K-WTYJV

vs2017 企业版密钥NJVYC-BMHX2-G77MM-4XJMR-6Q8QF

标签列表