文章技術適合初學者。高級的C#開發工程師這些估計都熟悉到爛了,望不要噴。
第一、C#代碼要操作IIS 就必須先導入 Microsoft.Web.Administration.dll ,方便控制台程序做成windows服務,還要導入Topshelf.dll,附件中有這兩個dll,
想要玩一下的可以下載試試,點擊Install.bat做windows服務,也可以直接點擊exe文件在控制台上查看您要的效果, 點擊下載附件.
第二、整個小工具就兩個類,Program.cs , IISWatcherControl.cs 直接貼代碼了,這個小工具只是為了幫您自動重啟IIS,但是程序為什么會崩潰或者 程序池會掛掉,
還是要您自己檢查下寫的代碼哪里寫的不合理導致的.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Topshelf;
namespace IISWatcherService
{
class Program
{
static void Main(string[] args)
{
HostFactory.Run((x) =>
{
x.Service<IISWatcherControl>();
x.RunAsLocalSystem();
x.SetServiceName("IISWatcherService");
x.SetDisplayName("IISWatcherService");
x.SetDescription("監控IIS運行狀態");
});
}
}
}
C#監控IIS代碼
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Web.Administration;
using Topshelf;
namespace IISWatcherService
{
public class IISWatcherControl : ServiceControl
{
#region ServiceControl 成員
public bool Start(HostControl hostControl)
{
MonitoringIISApp();
return true;
}
public bool Stop(HostControl hostControl)
{
return true;
}
/// <summary>
/// 每個十秒鍾監控一次是否有暫停的web站點和應用程序池
/// </summary>
public void MonitoringIISApp()
{
ServerManager webIIS = new ServerManager();
Task.Factory.StartNew(() =>
{
var result = string.Empty;
while (true)
{
//獲取IIS站點
var sites = webIIS.Sites;
foreach (var item in sites)
{
if (item.Bindings.Any(ii => ii.Protocol != "ftp") && item.State == ObjectState.Stopped)
{
if (item.Start() == ObjectState.Started)
{
result = string.Format(item.Name + ",站點啟動成功 {0}",DateTime.Now);
Console.WriteLine(result);
WriteFile(result);
}
}
}
//獲取應用程序池
var applications = webIIS.ApplicationPools;
foreach (var item in applications)
{
if (item.State == ObjectState.Stopped)
{
if (item.Start() == ObjectState.Started)
{
result = string.Format(item.Name + ",應用程序池開啟成功 {0}", DateTime.Now);
Console.WriteLine(result);
WriteFile(result);
}
}
}
Thread.Sleep(TimeSpan.FromSeconds(10d));
}
});
}
/// <summary>
/// 日志寫入文件
/// </summary>
private void WriteFile(string message)
{
var directorypath = AppDomain.CurrentDomain.BaseDirectory + @"\LogFile";
if (!Directory.Exists(directorypath))
{
Directory.CreateDirectory(directorypath);
}
var path = string.Format(directorypath + @"\log_{0}.txt", DateTime.Now.ToString("yyyyMMdd"));
if (!File.Exists(path))
{
File.Create(path).Close();
}
using (StreamWriter sw=new StreamWriter(path,true,System.Text.Encoding.UTF8))
{
sw.WriteLine(message);
}
}
#endregion
}
}
時間飛快2017年一下就過去了,這是2018年的第一篇文章,希望今年可以寫些博文。
