鸿 网 互 联 www.68idc.cn

当前位置 : 主页 > .net技术 > asp.net编程 > >

C#IISRESET服务

来源:互联网 作者:佚名 时间:2015-12-08 03:01
最近要写个从页面上点击IISRESET按钮,就把服务器IISREST的功能。难点:1.IISREST后程序池停掉,失去EnvAgent的连接,response会失去,就不能返回状态,来判断是

最近要写个从页面上点击IISRESET按钮,就把服务器IISREST的功能。


难点:

1. IISREST后程序池停掉,失去EnvAgent的连接,response会失去,就不能返回状态,来判断是否IISRESET成功

2. IISREST由于成功率不高,必须判断是否成功启动,要是没有成功启动,影响很大,所以想到如下方法判断:

IISRESET >D:\\tmplog.txt

该命令会把执行结果放到D:\\tmplog.txt中,如果内容如下就可以判断是启动成功了

正在尝试停止... Internet 服务已成功停止 正在尝试启动... Internet 服务已成功启动

所以,思路如下:

先发送请求,执行 “IISRESET >D:\\tmplog.txt”这条命令

在等待一定时间,如40秒(等程序池启动起来),发送检查结果命令,

该命令判断tmplog.txt文件是否是最新的(最后修改时间是否是一分钟内),

再判断内容是否正确,

如果都正确,则IISRESET成功


(该代码已被淘汰,复制请看最后的代码)


核心代码如下

#region IISRest         /// <summary>         /// IISRESRT         /// </summary>         public static void IISReset()         {             try             {                 Logger.Info("IIS Reset Start");                 string filePath = "d:\\templog.txt";                 if (File.Exists(filePath))                 {                     File.Delete(filePath);                 }                 System.Diagnostics.Process p = new System.Diagnostics.Process();                 p.StartInfo.FileName = "cmd.exe";                 p.StartInfo.UseShellExecute = false;    //是否使用操作系统shell启动                 p.StartInfo.RedirectStandardInput = true;//接受来自调用程序的输入信息                 p.StartInfo.RedirectStandardOutput = true;//由调用程序获取输出信息                 p.StartInfo.RedirectStandardError = true;//重定向标准错误输出                 p.StartInfo.CreateNoWindow = true;//不显示程序窗口                 p.Start();//启动程序                 //向cmd窗口发送输入信息                 p.StandardInput.WriteLine("IISRESET > " + filePath + "&exit");                 p.StandardInput.AutoFlush = true;                 //p.StandardInput.WriteLine("exit");                 //向标准输入写入要执行的命令。这里使用&是批处理命令的符号,表示前面一个命令不管是否执行成功都执行后面(exit)命令,如果不执行exit命令,后面调用ReadToEnd()方法会假死                 //同类的符号还有&&和||前者表示必须前一个命令执行成功才会执行后面的命令,后者表示必须前一个命令执行失败才会执行后面的命令                 //获取cmd窗口的输出信息                 //string output = p.StandardOutput.ReadToEnd();                 //StreamReader reader = p.StandardOutput;                 //string line=reader.ReadLine();                 //while (!reader.EndOfStream)                 //{                 //    str += line + "  ";                 //    line = reader.ReadLine();                 //}                 p.WaitForExit();//等待程序执行完退出进程                 p.Close();             }             catch (Exception ex)             {                 Logger.Error("IIS Reset Exception:" + ex.ToString());             }             Logger.Info("IIS Reset Finish");             //Console.WriteLine(output);            }         /// <summary>         /// IISRESRT         /// </summary>         public static void IISReset(string ip)         {             try             {                 Logger.Info("IIS Reset Start");                 string filePath = "d:\\templog.txt";                 if (File.Exists(filePath))                 {                     File.Delete(filePath);                 }                 System.Diagnostics.Process p = new System.Diagnostics.Process();                 p.StartInfo.FileName = "cmd.exe";                 p.StartInfo.UseShellExecute = false;    //是否使用操作系统shell启动                 p.StartInfo.RedirectStandardInput = true;//接受来自调用程序的输入信息                 p.StartInfo.RedirectStandardOutput = true;//由调用程序获取输出信息                 p.StartInfo.RedirectStandardError = true;//重定向标准错误输出                 p.StartInfo.CreateNoWindow = true;//不显示程序窗口                 p.Start();//启动程序                 //向cmd窗口发送输入信息                 p.StandardInput.WriteLine("iisreset \\"+ip+" /restart >" + filePath + "&exit");                 p.StandardInput.AutoFlush = true;                 //p.StandardInput.WriteLine("exit");                 //向标准输入写入要执行的命令。这里使用&是批处理命令的符号,表示前面一个命令不管是否执行成功都执行后面(exit)命令,如果不执行exit命令,后面调用ReadToEnd()方法会假死                 //同类的符号还有&&和||前者表示必须前一个命令执行成功才会执行后面的命令,后者表示必须前一个命令执行失败才会执行后面的命令                 //获取cmd窗口的输出信息                 //string output = p.StandardOutput.ReadToEnd();                 //StreamReader reader = p.StandardOutput;                 //string line=reader.ReadLine();                 //while (!reader.EndOfStream)                 //{                 //    str += line + "  ";                 //    line = reader.ReadLine();                 //}                 p.WaitForExit();//等待程序执行完退出进程                 p.Close();             }             catch (Exception ex)             {                 Logger.Error("IIS Reset Exception:" + ex.ToString());             }             Logger.Info("IIS Reset Finish");             //Console.WriteLine(output);            }         /// <summary>         /// 判断IISReset是否成功 (已在IISControl中实现,这边代码不完全)         ///          /// 由于IISReset后会失去返回,所以需要重新发送请求来获取IISReset的结果         /// 这里采用很短时间段里面检查IISREST时记录在d:\\templog.txt中的日记来判断         ///          /// 需要判断文件的时间某段时间内,并且内容是重启正确         ///          /// </summary>         /// <returns></returns>         public static bool IsResetSuccess()         {             string filePath = "d:\\templog.txt";             return File.ReadAllText(filePath).Trim().Equals("正在尝试停止...\r\r\nInternet 服务已成功停止\r\r\n正在尝试启动...\r\r\nInternet 服务已成功启动");         }         /// <summary>         /// 获取 IISRESET 日记内容         /// </summary>         /// <returns></returns>         public static string GetIISResetLog()         {             string filePath = "d:\\templog.txt";             return File.ReadAllText(filePath, Encoding.Default).Trim();         }         /// <summary>         /// 获取 IISREST 日记文件的时间差,来判断是否是最近这次的日记         /// </summary>         /// <returns></returns>         public static string IISResetTimeSpan()         {             DateTime t1 = DateTime.Now;             string filePath = "d:\\templog.txt";             FileInfo fi = new FileInfo(filePath);             DateTime t2 = fi.LastWriteTime;             return ExecDateDiff(t2, t1);         }         #endregion IISRest


网友评论
<