当前位置:首页 > Windows程序 > 正文

C#IISRESET服务终结版

2021-03-25 Windows程序

技术分享

实现如上图所示的,页面一键控制服务器IISRESET


服务器上部署了EnvAgency这个Service来接受请求并处理以及返回,但是IISRESET这个请求特殊,因为IISRESET后会重启程序池,包括EnvAgency程序,就不能返回IISRESET请求的具体结果,但是IISRESET的单次成功率不高,又后果失败影响大,所以必须保证IISRESET的成功。试过很多中方法,具体尝试方法记录于,某些情况下,这些方法是可行的。但是我这边由于严格的域帐号机器帐号控制导致不可行。所以换了如下方法:

技术分享

环境系统调用服务器上代理,代理触发服务器上IISRESET的应用,该应用会启动iisreset并且读取返回,如果返回是正确的,就退出,否则继续调用iisreset,这样就确保多次后iis启动成功。由于IISRESET应用是写成Console程序,不受IIS程序池影响。并且加入Nlog来记录相应信息,方便出问题后排查。


在判断iis启动成功方面:采用循环5秒请求下服务器时间,看服务器是否有反应来判断启动是否成功。


应用存放目录:

D:\\websites\\EnvCmd\\cmdtest


IISRESET的应用配置具体代码如下:

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