苏飞论坛

标题: C# Windows Service|Windows服务程序(实现监控网站是否能访问) [打印本页]

作者: 站长苏飞    时间: 2012-9-17 16:35
标题: C# Windows Service|Windows服务程序(实现监控网站是否能访问)
什么是                                          C# Windows Service服务程序?  
C# Windows服务程序开发之前要明白什么是Windows服务,Windows Service,也称Windows服务,是32位Windows操作系统中一种长期运行的后台程序。它们长期后台运行,没有用户界面,默默无闻,但它们却是支持Windows正常运行的幕后英雄,却永无出头之日。我称之为最稳定的程序之一。
  因为他会随着系统的自动启动而启动,自动关闭而关闭,不需要用户直接登录,直接开机就可以启动。
很方便 稳定。这类程序一般是做为服务或者是监控类的东东。也正是因为他的稳定和方便。
但在C#里面怎么实现它呢?
源代码程序下载地址: (, 下载次数: 1036)
我们一起来看看吧,
我以VS2010为例子。我们先来新建一个Window服务项目 如下图所示
(, 下载次数: 386)
我们再来看看VS2010都给我们创建了什么
(, 下载次数: 336)
我们一起来看看Services1里面都有什么吧
[C#] 纯文本查看 复制代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;

namespace WindowsService
{
    public partial class Service1 : ServiceBase
    {
        public Service1()
        {
            InitializeComponent();
        }

        /// <summary>
        /// 开启服务时要执行的方法
        /// </summary>
        /// <param name="args"></param>
        protected override void OnStart(string[] args)
        {

        }

        /// <summary>
        /// 停止服务时要执行的方法
        /// </summary>
        protected override void OnStop()
        {

        }
    }
}


其实里面只有两个方法,OnStart启动服务时要执行的方法,也就是程序的入口了。
下面咱们一起来做一个监控自己网站的功能吧,先来看看第一个方法的实现吧。
使用C# HttpHelper类来访问网站
我先来说说我的思路吧,我事先设置一个关键字,如果通过抓来的网页源代码存在这个关键字的话就说明网站正常,否则就不正常,并写文件做记录
我们一起来看方法吧
首先来定义一个定时检查器我设置时间 为1分钟检查一次
[C#] 纯文本查看 复制代码
//定期类
        private System.Timers.Timer aTimer;

        /// <summary>
        /// 开启服务时要执行的方法
        /// </summary>
        /// <param name="args"></param>
        protected override void OnStart(string[] args)
        {
            aTimer = new System.Timers.Timer();
            //到达时间的时候执行事件;
            aTimer.Elapsed += new ElapsedEventHandler(timer1_Tick);
            // 设置引发时间的时间间隔 此处设置为1秒(1000毫秒)
            aTimer.Interval = 60 * 1000;
            //设置是执行一次(false)还是一直执行(true);
            aTimer.AutoReset = true;
            //是否执行System.Timers.Timer.Elapsed事件;
            aTimer.Enabled = true;
        }

具体的timer1_Tick实现如下
[C#] 纯文本查看 复制代码
/// <summary>
        /// 定时事件
        /// </summary>
        /// <param name="source">源对象</param>
        /// <param name="e">ElapsedEventArgs事件对象</param>
        protected void timer1_Tick(object source, ElapsedEventArgs e)
        {
            //帮助参考http://www.cnblogs.com/sufei/archive/2011/10/22/2221289.html
            HttpHelps objhh = new HttpHelps();
            //取网站源代码
            string result = objhh.GetHttpRequestStringByNUll_Get("http://sufei.cnblogs.com", null);
            //看看查询出来的网页代码是否存在Perky Su
            if (result.Contains("Perky Su"))
            {
                //如果存在我设置的关键字说明我的网站是正常的
                WriteFile("D:\\log\\" + DateTime.Now.ToString("yyyy-MM-dd") + ".txt",
                    "您监控的网站http://sufei.cnblogs.com正常监控时间 " + DateTime.Now.ToString() + "\r\n");
            }
            else
            {
                WriteFile("D:\\log\\" + DateTime.Now.ToString("yyyy-MM-dd") + ".txt",
                    "您监控的网站http://sufei.cnblogs.com出现异常情况监控时间 "  + DateTime.Now.ToString() + "\r\n");
                //如果不存在说明我的网站是不正常的
            }
        }

        /// <summary>
        /// 写文件
        /// </summary>
        /// <param name="_filePath">文件路径</param>
        /// <param name="TOEXCELLR">要写入的内容</param>
        private void WriteFile(string _filePath, string TOEXCELLR)
        {
            //检查是否创建文档成功
            if (CreateXmlFile(_filePath))
            {  //写文本,
                using (StreamWriter fs = new StreamWriter(_filePath, true, System.Text.Encoding.UTF8))
                {
                    fs.Write(TOEXCELLR);
                }
            }
        }

        /// <summary>
        /// 创建文件 的方法
        /// </summary>
        /// <param name="filepath">路径</param>
        /// <returns>文件存在返True否在为False</returns>
        private static Boolean CreateXmlFile(string filepath)
        {
            try
            {
                //记录成功时的记录
                if (!File.Exists(filepath))
                {
                    using (StreamWriter xmlfs = new StreamWriter(filepath, true, System.Text.Encoding.UTF8))
                    {
                        xmlfs.Write("");
                    }
                    return true;
                }
                else
                {
                    return true;
                }
            }
            catch (Exception)
            {
                return false;
            }
        }


这样的话咱们的监控功能就算是实现了,
那么再来处理两个事件
[C#] 纯文本查看 复制代码
/// <summary>
        /// 停止服务时要执行的方法
        /// </summary>
        protected override void OnStop()
        {
            aTimer.Enabled = false;
        }

        /// <summary>
        /// 服务恢复时
        /// </summary>
        protected override void OnContinue()
        {
            aTimer.Enabled = true;
        }


好了咱们的监控程序算是大功告成了。
要怎么才能安装成为服务程序呢?一起来看一下吧,首先我们一添加一个这样的类
[C#] 纯文本查看 复制代码
[RunInstaller(true)]
    public partial class InstallerServices : System.Configuration.Install.Installer
    {
        /// <summary>
        /// 必需的设计器变量。
        /// </summary>
        private System.ComponentModel.Container components = null;
        private System.ServiceProcess.ServiceProcessInstaller spInstaller;
        private System.ServiceProcess.ServiceInstaller sInstaller;

        public InstallerServices()
        {
            // 该调用是设计器所必需的。
            InitializeComponent();
            // TODO: 在 InitComponent 调用后添加任何初始化
        }
        #region Component Designer generated code

        /// <summary>
        /// 设计器支持所需的方法 - 不要使用代码编辑器修改
        /// 此方法的内容。
        /// </summary>
        private void InitializeComponent()
        {
            components = new System.ComponentModel.Container();
            // 创建ServiceProcessInstaller对象和ServiceInstaller对象
            this.spInstaller = new System.ServiceProcess.ServiceProcessInstaller();
            this.sInstaller = new System.ServiceProcess.ServiceInstaller();
            // 设定ServiceProcessInstaller对象的帐号、用户名和密码等信息
            this.spInstaller.Account = System.ServiceProcess.ServiceAccount.LocalSystem;
            this.spInstaller.Username = null;
            this.spInstaller.Password = null;

            // 设定服务名称服务程序的名称
            this.sInstaller.ServiceName = "Jinakong";
            // 设定服务的启动方式
            this.sInstaller.StartType = System.ServiceProcess.ServiceStartMode.Automatic;
            this.Installers.AddRange(new System.Configuration.Install.Installer[] { this.spInstaller, this.sInstaller });

        }
        #endregion

    }


其实我们什么也不需要做只需要把这个类放在这里就行了,我们只要修改一个监控程序的服务名称就行了。
现在我们生成一个项目 ,来安装一下看看效果吧
安装的时候我们需要用.net的一个Installer工具
直接进入.net命令行(VS2010命令行提示工具大家自己打开吧,不会的可以上网找一下,呵呵)
输入如下
(, 下载次数: 401)
然后回车就行了
(, 下载次数: 384)
好了服务程序安装好了,下面一起来启动一下吧,开始程序输入services.msc
如下图
(, 下载次数: 366)

我们启动后等上个五分钟然后到我们事先设置好的日志文件夹下面来看看是什么效果 吧
(, 下载次数: 361)
如果我们的服务程序写错了,要修改怎么办呢?其实卸载的方法很简单,只要在目录前加上了/u就行

(, 下载次数: 370)
如果真的修改了其实还是更简单的方法,只要把服务停止 一下,然后覆盖一下你安装目录下的文件就OK了。
不需要卸载服务的。
程序写的比较简单,只当入个门吧

作者: 司马文武    时间: 2012-12-5 14:13
学习下!mark!
作者: 司马文武    时间: 2012-12-5 14:14
学习下了!mark!
作者: whc1q7    时间: 2012-12-13 10:11
学习中
作者: 剪刀手    时间: 2012-12-28 11:15
不错,呵呵
作者: asmin123    时间: 2012-12-28 22:39
我来看看看哈
作者: 站长苏飞    时间: 2012-12-29 09:03
asmin123 发表于 2012-12-28 22:39
我来看看看哈

随便看免费
作者: Fly    时间: 2012-12-29 21:54
不错
作者: dyrne    时间: 2013-1-6 15:28
挺好,我应该入门了,哈哈
作者: 幻雪丶逆时光    时间: 2013-1-6 15:29
一直有写 服务. 最喜欢 给自己留...后门了
作者: lkkla    时间: 2013-1-9 15:20
看看
作者: xjwebs    时间: 2013-1-26 21:14
code很棒,以前也想过做服务做监控用,这次可以借用思路了{:soso_e179:}
感谢苏飞哥
作者: 站长苏飞    时间: 2013-1-26 22:38
xjwebs 发表于 2013-1-26 21:14
code很棒,以前也想过做服务做监控用,这次可以借用思路了
感谢苏飞哥

客气了,呵呵
作者: xjwebs    时间: 2013-1-28 22:08
苏飞,我想问下帖子里面的timer1_Tick事件中,有一段代码如下:
[code=csharp]
HttpHelps objhh = new HttpHelps();
//取网站源代码
string result =objhh.GetHttpRequestStringByNUll_Get("http://sufei.cnblogs.com", null);
[/code]
可我下载过来的HttpHelper类中,是不存在这个方法的,会导致无法调用,我把图放上来你看下,httphelper类中也查找不到该方法的,可以发一下那个方法吗:

(, 下载次数: 179)
1、无法调用不存在的方法
(, 下载次数: 178)
2、类中不存在该方法
作者: xjwebs    时间: 2013-1-28 23:29
找到了,原来在帖子里压缩包中的旧版HttpHelps类里面才有
作者: 站长苏飞    时间: 2013-1-28 23:44
xjwebs 发表于 2013-1-28 23:29
找到了,原来在帖子里压缩包中的旧版HttpHelps类里面才有

是的,建议使用新版的
作者: 天使之翼    时间: 2013-3-8 22:29
需要学习下
作者: ck596237229    时间: 2013-4-29 21:47
最近一个网站老出问题,拿来测试下,谢谢分享
作者: keep_going    时间: 2013-10-1 10:15
学习了,mark

作者: 「_多_多_°」    时间: 2014-2-27 22:44
强烈支持楼主ing……
作者: 梧桐雨    时间: 2014-3-3 10:33
不错  学习下
作者: 小熊工作室    时间: 2014-3-27 15:30
真是难得给力的帖子啊,强烈支持楼主。
作者: ed2000de    时间: 2014-5-29 22:04
受教了,学习中……
作者: lanxingyi2010    时间: 2014-6-22 15:41
受教了,学习中……
作者: zhanwu007    时间: 2016-2-10 14:53
强烈支持楼主ing……
作者: MAX-龙骑士    时间: 2016-8-25 15:48
如果没安装VS,怎么在第三方客户机上部署安装Installer工具
作者: 站长苏飞    时间: 2016-8-25 15:53
MAX-龙骑士 发表于 2016-8-25 15:48
如果没安装VS,怎么在第三方客户机上部署安装Installer工具

http://www.sufeinet.com/thread-8145-1-1.html
作者: MAX-龙骑士    时间: 2016-8-26 10:33
膜拜中....!
作者: MAX-龙骑士    时间: 2016-8-26 10:36
sc create Yunfan binPath= "D:\Debug\WindowsService.exe" start= auto
sc delete Yunfan   

看到了,试着用了一下命令
搞定!!!!!
作者: 雨之秋水    时间: 2016-9-6 16:35
我是来入门的
作者: livehu5188    时间: 2021-8-15 09:18
学习了 非常感谢楼主分享啊




欢迎光临 苏飞论坛 (http://www.sufeinet.com/) Powered by Discuz! X3.4