概述
最近公司的 运维碰到了一些问题,在客户某台服务器(系统为2003,IIS版本为6.0)上某个比较重要的应用程序池会不定期的停止,原因未知。这样就影响了服务的运行。
运维启动应用程序池后问题解决,但是因为很多时候应用程序池挺值得时间是在非上班时间,所以向开发求助一个解决办法。
准备做一个windows服务在服务器上运行,定时检查特定的应用程序池的状态,如果停止了,就把它启动,并同时记录日志信息。
相关的代码如下:
private void MonitoringISSAppPool()
{
// string method_Recycle = "Recycle"; //Start开启
Recycle回收
Stop 停止
string IIsMsg = "";
string method = "Start";
DirectoryEntry appPool = new DirectoryEntry("IIS://localhost/W3SVC/AppPools");
try
{
#region IIS6.0 Famework2.0
System.Collections.IEnumerator enumertor = appPool.Children.GetEnumerator();
DirectoryEntry subitem;
while (enumertor.MoveNext())
{
subitem = (DirectoryEntry)enumertor.Current;
int state = Convert.ToInt32(subitem.Properties["ServerState"].Value);
if (state != 2 && AppPoolNameList.Contains(subitem.Name))
{
DirectoryEntry findPool = appPool.Children.Find(subitem.Name, "IIsApplicationPool");
findPool.Invoke(method, null);
appPool.CommitChanges();
appPool.Close();
IIsMsg += string.Format("名称:[{0}],标识:{1},当前状态:[{2}],时间:{3}n", subitem.Name, subitem.SchemaClassName, "已启动", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff"));
}
}
#endregion
#region 高版本IIS重启用的方法
//foreach (DirectoryEntry item in appPool.Children)
//{
//
//string AppPoolCommand = item.Properties["ManagedPipelineMode"].Value.ToString();
//
string ManagedRuntimeVersion = item.Properties["ManagedRuntimeVersion"].Value.ToString();//,net版本号
//
string AppPoolState = item.Properties["AppPoolState"].Value.ToString();//当前状态
//
if (AppPoolState != "2" && AppPoolNameList.Contains(item.Name))
//
{
//
DirectoryEntry findPool = appPool.Children.Find(item.Name, "IIsApplicationPool");
//
findPool.Invoke(method_Start, null);
//
appPool.CommitChanges();
//
appPool.Close();
//
IIsMsg += string.Format("{0},名称:[{1}],NET版本:{2},标识:{3},当前状态:[{4}],时间:{5}n", "", item.Name, ManagedRuntimeVersion, item.SchemaClassName, "已启动", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff"));
//
}
//}
#endregion
}
catch (Exception ex)
{
IIsMsg += ex.Message + "----------------------------------" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff") + "n";
}
#region 错误或者正确信息写入日志
//错误或者正确信息写入日志
string strAssemblyFilePath = Assembly.GetExecutingAssembly().Location;
string strAssemblyDirPath = Path.GetDirectoryName(strAssemblyFilePath);
string FilePath = strAssemblyDirPath + "\ErrorLog.txt";
if (!File.Exists(FilePath))
{
FileStream fs1 = new FileStream(FilePath, FileMode.Create, FileAccess.Write);//创建写入文件
StreamWriter sw = new StreamWriter(fs1);
sw.WriteLine(IIsMsg);//开始写入值
sw.Close();
fs1.Close();
}
else
{
FileStream fs1 = File.Open(FilePath, FileMode.Append, FileAccess.Write);
StreamWriter sw = new StreamWriter(fs1);
sw.WriteLine(IIsMsg);//开始写入值
sw.Close();
fs1.Close();
}
#endregion
}
可以看到IIS6.0的监控对象、属性与后来版本不尽相同。
最后
以上就是乐观吐司为你收集整理的对于IIS上的应用程序池监控的全部内容,希望文章能够帮你解决对于IIS上的应用程序池监控所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复