C#IISRESET服务终结版
实现如上图所示的,页面一键控制服务器IISRESET
服务器上部署了EnvAgency这个Service来接受请求并处理以及返回,但是IISRESET这个请求特殊,因为IISRESET后会重启程序池,包括EnvAgency程序,就不能返回IISRESET请求的具体结果,但是IISRESET的单次成功率不高,又后果失败影响大,所以必须保证IISRESET的成功。试过很多中方法,具体尝试方法记录于,某些情况下,这些方法是可行的。但是我这边由于严格的域帐号机器帐号控制导致不可行。所以换了如下方法:
环境系统调用服务器上代理,代理触发服务器上IISRESET的应用,该应用会启动iisreset并且读取返回,如果返回是正确的,就退出,否则继续调用iisreset,这样就确保多次后iis启动成功。由于IISRESET应用是写成Console程序,不受IIS程序池影响。并且加入Nlog来记录相应信息,方便出问题后排查。
在判断iis启动成功方面:采用循环5秒请求下服务器时间,看服务器是否有反应来判断启动是否成功。
应用存放目录:
D:\\websites\\EnvCmd\\cmdtestIISRESET的应用配置具体代码如下:
using NLog; using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks; namespace cmdtest { public class ProcessUtil { private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); public static bool IISReset() { Logger.Info("Start IISRESET"); int flag = 0; string output = IISResetProcess(); Logger.Info(output); string regx = "正在尝试停止...\r\r\nInternet 服务已成功停止\r\r\n正在尝试启动...\r\r\nInternet 服务已成功启动"; while (flag < 10 && !output.Contains(regx)) { output = IISResetProcess(); Logger.Info(output); flag++; } bool result = output.Contains(regx); Logger.Info("Finish IISRESET - result : " + result); return result; } public static string IISResetProcess() { Process pro = new Process(); // 设置命令行、参数 pro.StartInfo.FileName = "cmd.exe"; pro.StartInfo.UseShellExecute = false; pro.StartInfo.RedirectStandardInput = true; pro.StartInfo.RedirectStandardOutput = true; pro.StartInfo.RedirectStandardError = true; pro.StartInfo.CreateNoWindow = true; // 启动CMD pro.Start(); // 运行端口检查命令 pro.StandardInput.WriteLine("iisreset"); pro.StandardInput.WriteLine("exit"); return pro.StandardOutput.ReadToEnd(); } } }using NLog; using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks; namespace cmdtest { class Program { private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); static void Main(string[] args) { Logger.Info("test"); Console.WriteLine(ProcessUtil.IISReset()); } } }温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/67539.html