苏飞—Perky Su

签名: 软件开发,功能定制,全国各种接口开发,网页抓取程序,请联系我给我留言      Q Q:                    

posts - 184, comments - 1667, trackbacks - 3, articles - 5
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

什么是Windows服务程序员?

C# Windows服务程序开发之前要明白什么是Windows服务,Windows Service,也称Windows服务,是32位Windows操作系统中一种长期运行的后台程序。它们长期后台运行,没有用户界面,默默无闻,但它们却是支持Windows正常运行的幕后英雄,却永无出头之日。我称之为最稳定的程序之一。

  因为他会随着系统的自动启动而启动,自动关闭而关闭,不需要用户直接登录,直接开机就可以启动。

很方便 稳定。这类程序一般是做为服务或者是监控类的东东。也正是因为他的稳定和方便。

但在C#里面怎么实现它呢?

我们一起来看看吧,

我以VS2010为例子。我们先来新建一个Window服务项目 如下图所示

我们再来看看VS2010都给我们创建了什么

我们一起来看看Services1里面都有什么吧

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分钟检查一次

        //定期类
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实现如下

  /// <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;
}
}

这样的话咱们的监控功能就算是实现了,

那么再来处理两个事件

    /// <summary>
/// 停止服务时要执行的方法
/// </summary>
protected override void OnStop()
{
aTimer.Enabled = false;
}

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

好了咱们的监控程序算是大功告成了。

要怎么才能安装成为服务程序呢?一起来看一下吧,首先我们一添加一个这样的类

 [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命令行提示工具大家自己打开吧,不会的可以上网找一下,呵呵)

输入如下

然后回车就行了

好了服务程序安装好了,下面一起来启动一下吧,开始程序输入services.msc

如下图


我们启动后等上个五分钟然后到我们事先设置好的日志文件夹下面来看看是什么效果 吧

如果我们的服务程序写错了,要修改怎么办呢?其实卸载的方法很简单,只要在目录前加上了/u就行了

如果真的修改了其实还是更简单的方法,只要把服务停止 一下,然后覆盖一下你安装目录下的文件就OK了。

不需要卸载服务的。

程序写的比较简单,只当入个门吧

程序下载地址:WindowsService.zip

-------------------------------------------------------------签名部分------------------------------------------------------------------------

                          

         欢迎大家转载,如有转载请注明文章来自:   http://sufei.cnblogs.com/   

签名:做一番一生引以为豪的事业;在有生之年报答帮过我的人;并有能力帮助需要帮助的人;    

软件开发,功能定制,请联系我给我留言 QQ:361983679 Email:sufei.1013@163.com  MSN:sufei.1013@163.com 


-------------------------------------------------------------------推荐文章--------------------------------------------------------------
1.C#仿QQ皮肤 2.Sql2005学习笔记 3.httpHelper类

Feedback

#1楼  回复 引用 查看   

2011-12-10 13:25 by 赌神      
试试先~

#2楼  回复 引用 查看   

2011-12-10 13:27 by 么有爱情的色鬼      
我想问下,服务的性能上有那些考虑呢?
都有那些可以应用场景呢?

#3楼[楼主]  回复 引用 查看   

2011-12-10 13:32 by 苏飞      
@么有爱情的色鬼
比如你的程序需要长期运行,关机开机的需要重新启动
比如像我这样做监控类型的。可以监控你硬盘的某的文件,以及文件夹等,或者自动重命名一些新建的文件,自动检查新放入本路径的文件等等。
总之它的好处就是稳定,方便,再就是,无声无息的服务。

#4楼  回复 引用 查看   

2011-12-10 13:40 by 么有爱情的色鬼      
@苏飞
谢谢lz的解释;
可以说任务性的东西采用服务是比较合理的了!

#5楼[楼主]  回复 引用 查看   

2011-12-10 13:42 by 苏飞      
@么有爱情的色鬼
不过最好是根据项目 情况,我们用这个主要是监控网站是否会打不开

#6楼  回复 引用 查看   

2011-12-10 13:45 by 么有爱情的色鬼      
@苏飞
谢谢!!

#7楼  回复 引用 查看   

2011-12-10 14:21 by 死神的背影      
// 设置引发时间的时间间隔 此处设置为1秒(1000毫秒)
aTimer.Interval = 60 * 1000;
这里应该是1分钟吧?

#8楼[楼主]  回复 引用 查看   

2011-12-10 14:28 by 苏飞      
@死神的背影
这个本来是这样写的
// 设置引发时间的时间间隔 此处设置为1秒(1000毫秒)
aTimer.Interval = 取Web配置文件的秒数* 1000
本来是从配置文件取的,我直接*1000你直接在配置文件写秒就行了,不过这里没有使用,是为了让大家看着方便,要不还得来了配置文件过来。
注释没有修改
是的确定是一分钟的意思

#9楼  回复 引用 查看   

2011-12-10 15:55 by 无殇天下      
谢了,受教了

#10楼[楼主]  回复 引用 查看   

2011-12-10 16:08 by 苏飞      
@无殇天下
大家看不明白的可以提提建议,我写的不够细

#11楼  回复 引用   

2011-12-10 18:18 by 365uptime.com[未注册用户]
www.365uptime.com 网站 / 服务器在线监控,通过邮件 短信 报警通知管理员!

#12楼[楼主]  回复 引用 查看   

2011-12-10 18:44 by 苏飞      
@365uptime.com
这个广告就没有必要了吧,有监控宝呢?

#13楼[楼主]  回复 引用 查看   

2011-12-10 19:02 by 苏飞      
补充一点InstallerServices 这个类可以单独放出来一不定要写在一个类文件下面,大家请注意
发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 2283189 Wk22BpCbvVI=