Monitoring a web site on the local server with a Windows Service

I wrote the code below to monitor a website that was running on a local web server.  The goal was to reset the web server whenever the WebRequest object recieved a 404 error from the web server.  If a 404 error is recieved, the service runs the command specified in the web.config file.  The service operates on a timer and runs at a period defined in the web.config file.  Personally, I don't think the application is great in that it only looks for a 404 error, but it did solve my problem.  

Why restart the web service?  In our situation, a 404 was indicitive of a problem that required a restart.  I wrote this for a server running an old COM+/Classic ASP application that we are having trouble with.  In your situation, you can do as you please.

Paul Glavich(can I praise him enough) mentioned that .NET 2.0 provides a health monitoring service, so if you are using a .NET 2.0 app, you might want to look into that as oppossed to this solution. 

Enjoy

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.ServiceProcess;
using System.Text;
using System.Timers;
using System.Net;

namespace WebMonitor
{
    public partial class WebMonitorService : ServiceBase
    {
        public WebMonitorService()
        {
            InitializeComponent();
            _strUri = System.Configuration.ConfigurationSettings.AppSettings["URLToWatch"];
            _iInterval = Convert.ToInt32(System.Configuration.ConfigurationSettings.AppSettings["IntervalTimeFrame"]);
            _strCommandToRun = System.Configuration.ConfigurationSettings.AppSettings["CommandToRun"];
        }
        private int _iInterval;
        private string _strUri;
        private string _strCommandToRun;
        private Timer _TimerCheck;

        protected override void OnStart(string[] args)
        {
            // TODO: Add code here to start your service.
            _TimerCheck = new Timer();
            _TimerCheck.Interval = _iInterval;
            _TimerCheck.Enabled = true;
            _TimerCheck.Elapsed += new ElapsedEventHandler(_TimerCheck_Elapsed);
        }

        protected override void OnStop()
        {
            // TODO: Add code here to perform any tear-down necessary to stop your service.
            if (null != _TimerCheck)
            {
                _TimerCheck.Enabled = false;
                _TimerCheck.Dispose();
                _TimerCheck = null;
            }
        }
        private void _TimerCheck_Elapsed(Object sender, ElapsedEventArgs e)
        {
            int i = 0;
            System.Net.HttpWebRequest hwRequest = (HttpWebRequest)System.Net.WebRequest.Create(_strUri);
            System.Net.HttpWebResponse hwResponse;
            System.Net.WebHeaderCollection whColl;
            try
            {
                _TimerCheck.Enabled = false;
                hwResponse = (HttpWebResponse)hwRequest.GetResponse();
            }
            catch (System.Exception sysExc)
            {
                if (-1 != sysExc.Message.IndexOf("(404)"))
                {
                    System.Diagnostics.Process.Start(_strCommandToRun);
                    EventLog.WriteEntry("WebMonitor", "The following command was run.  Command:" + _strCommandToRun, EventLogEntryType.Information);
                }
                else
                {
                    EventLog.WriteEntry("WebMonitor", sysExc.Message, EventLogEntryType.Warning);
                }
            }
            finally
            {
                hwRequest = null;
                hwResponse = null;
                _TimerCheck.Enabled = true;
            }
        }
    }
}
 web.config file contents:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <appSettings>
        <add key="IntervalTimeFrame" value="60000" />
        <add key="URLToWatch" value="http://localhost/cmsvd" />
        <add key="CommandToRun" value="iisreset.exe" />
    </appSettings>
</configuration>

No Comments