一个监测IIS,并定时重新启动的程序

前言:我的Win2003 Server的IIS执行Asp老是不正常,长的时候可以用几天,短的时候才几个小时就动不动就超时,被客户骂得半死了。没办法所以写了个服务来检查。这是下策。

using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.ServiceProcess;
using System.Net;

namespace WuyinIISControler
{
    public class MainSrv : System.ServiceProcess.ServiceBase
    {
        private System.Timers.Timer timer1;
        /// 
        /// 必需的设计器变量。
        /// 
        private System.ComponentModel.Container components = null;
        string url = "http://www.5inet.net/checkIIS.asp";
        int timeout = 6000;
        int repeatTime = 300000;
        EventLog log = null;
        int Times = 1;

        public MainSrv()
        {
            // 该调用是 Windows.Forms 组件设计器所必需的。
            InitializeComponent();

            // TODO: 在 InitComponent 调用后添加任何初始化
        }

        // 进程的主入口点
        static void Main()
        {
            System.ServiceProcess.ServiceBase[] ServicesToRun;

            // 同一进程中可以运行多个用户服务。若要将
            //另一个服务添加到此进程,请更改下行
            // 以创建另一个服务对象。例如,
            //
            //   ServicesToRun = New System.ServiceProcess.ServiceBase[] {new Service1(), new MySecondUserService()};
            //
            ServicesToRun = new System.ServiceProcess.ServiceBase[] { new MainSrv() };

            System.ServiceProcess.ServiceBase.Run(ServicesToRun);
        }

        /// 
        /// 设计器支持所需的方法 - 不要使用代码编辑器 
        /// 修改此方法的内容。
        /// 
        private void InitializeComponent()
        {
            this.timer1 = new System.Timers.Timer();
            ((System.ComponentModel.ISupportInitialize)(this.timer1)).BeginInit();
            // 
            // timer1
            // 
            this.timer1.Interval = 300000;
            this.timer1.Elapsed += new System.Timers.ElapsedEventHandler(this.timer1_Elapsed);
            // 
            // MainSrv
            // 
            this.ServiceName = "WuyinIISControler";
            ((System.ComponentModel.ISupportInitialize)(this.timer1)).EndInit();
        }

        /// 
        /// 清理所有正在使用的资源。
        /// 
        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                if (components != null)
                {
                    components.Dispose();
                }
            }
            base.Dispose(disposing);
        }

        /// 
        /// 设置具体的操作,以便服务可以执行它的工作。
        /// 
        protected override void OnStart(string[] args)
        {
            log = new EventLog();
            log.Log = "Application";
            log.Source = this.ServiceName;
            foreach (string arg in args)
            {
                if (arg.ToUpper().StartsWith("/URL:"))
                    this.url = arg.Split(Convert.ToChar(":"))[1] + ":" + arg.Split(Convert.ToChar(":"))[2];
                if (arg.ToUpper().StartsWith("/TIMEOUT:"))
                    this.timeout = int.Parse(arg.Split(Convert.ToChar(":"))[1].ToString()) * 1000;
                if (arg.ToUpper().StartsWith("/REPEATTIME:"))
                    this.repeatTime = int.Parse(arg.Split(Convert.ToChar(":"))[1].ToString()) * 1000 * 60;

            }
            // TODO: 在此处添加代码以启动服务。
            this.timer1.Interval = this.repeatTime;
            this.timer1.Enabled = true;
            if (!CheckIIS(this.url))
                this.RestartIIS();
        }

        private bool CheckIIS(string url)
        {
            bool b = false;
            System.Net.WebResponse wsp = null;
            string msg = "正在执行第" + this.Times.ToString() + "次检测:\n检测地址:" + url + "\n超时设置:" + (this.timeout / 1000).ToString() + "秒\n检测间隔时间:" + (repeatTime / 1000 / 60).ToString() + "分\n检测结果:";
            try
            {
                System.Net.WebRequest wq = WebRequest.Create(url);
                wq.Timeout = this.timeout;
                wsp = wq.GetResponse();
                if (wsp.Headers.Count > 0)
                {
                    b = true;
                    msg += "正常";
                }
                wsp.Close();
            }
            catch (Exception ex)
            {
                b = false;
                msg += "错误\n详细内容:" + ex.Message;
            }
            finally
            {
                log.WriteEntry(msg);
            }
            return b;
        }

        private void RestartIIS()
        {
            try
            {
                System.Diagnostics.Process.Start("iisreset.exe", "/restart");
                log.WriteEntry("正在执行重新启动命令:iisreset.exe /restart");
            }
            catch (Exception ex)
            {
                log.WriteEntry("发生错误:\n" + ex.ToString());
            }
        }

        /// 
        /// 停止此服务。
        /// 
        protected override void OnStop()
        {
            // TODO: 在此处添加代码以执行停止服务所需的关闭操作。
            this.timer1.Enabled = false;
            log.Close();
            log.Dispose();
        }

        private void timer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            this.Times++;
            if (!CheckIIS(this.url))
                this.RestartIIS();
        }
    }
}

// ===========================

using System;
using System.Collections;
using System.ComponentModel;
using System.Configuration.Install;

namespace WuyinIISControler
{
    /// 
    /// ProjectInstaller 的摘要说明。
    /// 
    [RunInstaller(true)]
    public class ProjectInstaller : System.Configuration.Install.Installer
    {
        private System.ServiceProcess.ServiceProcessInstaller serviceProcessInstaller1;
        private System.ServiceProcess.ServiceInstaller serviceInstaller1;
        /// 
        /// 必需的设计器变量。
        /// 
        private System.ComponentModel.Container components = null;

        public ProjectInstaller()
        {
            // 该调用是设计器所必需的。
            InitializeComponent();

            // TODO: 在 InitializeComponent 调用后添加任何初始化
        }

        /// 
        /// 清理所有正在使用的资源。
        /// 
        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                if (components != null)
                {
                    components.Dispose();
                }
            }
            base.Dispose(disposing);
        }

        #region 组件设计器生成的代码
        /// 
        /// 设计器支持所需的方法 - 不要使用代码编辑器修改
        /// 此方法的内容。
        /// 
        private void InitializeComponent()
        {
            this.serviceProcessInstaller1 = new System.ServiceProcess.ServiceProcessInstaller();
            this.serviceInstaller1 = new System.ServiceProcess.ServiceInstaller();
            // 
            // serviceProcessInstaller1
            // 
            this.serviceProcessInstaller1.Account = System.ServiceProcess.ServiceAccount.LocalSystem;
            this.serviceProcessInstaller1.Password = null;
            this.serviceProcessInstaller1.Username = null;
            // 
            // serviceInstaller1
            // 
            this.serviceInstaller1.DisplayName = "无垠IIS控制器";
            this.serviceInstaller1.ServiceName = "WuyinIISControler";
            this.serviceInstaller1.StartType = System.ServiceProcess.ServiceStartMode.Automatic;
            this.serviceInstaller1.AfterInstall += new InstallEventHandler(serviceInstaller1_AfterInstall);
            // 
            // ProjectInstaller
            // 
            this.Installers.AddRange(new System.Configuration.Install.Installer[] {
                       this.serviceProcessInstaller1,
                       this.serviceInstaller1});

        }
        #endregion

        private void serviceInstaller1_AfterInstall(object sender, InstallEventArgs e)
        {
            System.ServiceProcess.ServiceController sc = new System.ServiceProcess.ServiceController("WuyinIISControler");
            sc.Start(new string[] { "/url:http://www.5inet.net/checkIIS.asp", "/timeout:10", "/repeatTime:5" });
            sc.Dispose();
        }
    }
}

img_1

Contributors: FHL