C#IISRESET服务终结版

背景介绍:

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

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

环境系统调用服务器上代理,代理触发服务器上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());
        }
    }
}

服务器代理EvnAgency中IISReset调用如下:

public JsonResult IISReset(PostPackBase pack)
        {
            var resp = new APIResponse<string>()
            {
                StateCode = StateCode.Success,
                Message = ""
            };
            var accessToken = LoginSecurity.DecodeAccessToken(pack.Token);
            if (accessToken == null)
            {
                resp.StateCode = StateCode.Fail;
                resp.Message = "操作用户无法识别!";
            }
            else if (accessToken.ExpiredTime < DateTime.Now)
            {
                resp.StateCode = StateCode.Fail;
                resp.Message = "登陆信息过期!";
            }
            else
            {               
                try
                {
                    var token = LoginSecurity.DecodeAccessToken(pack.Token);
                    EnvMachine envmachine = EnvMachineBiz.GetCurrentMachine();
                    string ip = envmachine.IP;
                    Logger.Info("IISReset start by " + token.Alias + " on " + ip);
                    string str = string.Format("{0} Reset IIS on {1} ", token.Alias, ip) ;
                    EnvOperationLogBiz.LogOptIISReset(envmachine.EnvSubId, token.Alias, str, envmachine.Id);
                    IISUtil.IISReset();                  
                }
                catch (Exception ex)
                {
                    resp.StateCode = StateCode.Fail;
                    resp.Message += ex.ToString();
                    Logger.ErrorException("IISReset status result : Exception, " + ex.ToString(), ex);
                }             
            }
            return Json(resp, JsonRequestBehavior.DenyGet);
        }

具体调用应用程序代码如下:

public static void IISReset()
        {
            Logger.Info("Start D:\\websites\\EnvCmd\\cmdtest");
            Process.Start("D:\\websites\\EnvCmd\\cmdtest");
        }

环境管理系统中前端代码如下:

html代码如下

<li><a onclick="javascript: pageui.render(‘iisreset‘)">IIS Reset</a></li>

js代码如下

////// 主页面 //////
pageui = {
    render: function (pageType) {
        var page;
        if (pageType == ‘iisreset‘) {
            page = iisresetpage;
        }       
        page.render();
    }
};
var iisresetpage = {
    render: function () {
       
        var container = $(pageid.mainContent);
        container.empty();
        chcoreui.attachLoader(container, pageid.loader, 410, 100);
        var url = ‘/IIS/GetAllMachines‘;
        var pack = new Object();
        pack.Token = $.readCookie(‘accessToken‘);
        var submitData = JSON.stringify(pack);
        $.ajax({
            type: "POST",
            url: url,
            data: submitData,
            dataType: "json",
            contentType: "application/json",
            crossDomain: true,
            success: function (results) {
                if (results.StateCode == 0) {
                    // 成功
                    var bodyContent = ‘‘;
                    $.each(results.Data, function (idx, item) {
                        bodyContent += ‘<tr><td style="text-align:center;"><button class="link iisresetbtn"><i class="icon-play"></i></button></td><td>‘ + item.MachineName + ‘</td><td>‘ + item.IPAddress + ‘</td><td style="text-align:center;">‘ + item.DomainName + ‘</td><td><button class="link logbtn"><span class="mif-loop2"></span>日志</button></td></tr>‘;
                    });
                    
                    container.empty();
                    container.html(‘<table class="table bordered striped hovered dataTable" cellspacing="0" id="apppooltable"><thead><tr><th><button class="resetallbtn warning"><i class="icon-play on-left"></i>重启IIS</button></th><th>机器名</th><th>IP地址</th><th>环境名称</th><th>Actions</th></tr></thead><tbody>‘ + bodyContent + ‘</tbody></table>‘);
                    $(‘#apppooltable‘).dataTable({
                        "paging": false,
                        "searching": true,
                        "ordering": true,
                        "info": "程序池信息表",
                        // "scrollY": "450px",
                        "scrollCollapse": true,
                        "dom": ‘<"tool1bar">fr1tip‘
                    });
                    $(".iisresetbtn").click(function () {
                        iisresetpage.startReset($(this));
                    });
                    
                    $(".resetallbtn").click(function () {
                        if (!$(this).hasClass(‘disabled‘)) {
                            var syncbtns = $(‘.iisresetbtn‘);
                            $(this).addClass(‘disabled‘);
                            $.each(syncbtns, function (idx, item) {
                                item.click();
                            });
                        }
                    });
                    $(".logbtn").click(function () {
                        iisresetpage.getResetLog($(this));
                    });
                    
                }
            },
            error: function (xhr, status, error) {
                $.note(‘Error‘, ‘获取程序池信息失败,请联系管理员.‘, ‘error‘);
            }
        });
    },
    startReset: function (sender) {
        var parentObj = sender.parent();
        var ip = parentObj.next().next().text();
        iisresetpage.postReset(ip, sender);
    },
    postReset:function(ip,sender)
    {
        var parentObj = sender.parent();
        parentObj.empty();
        parentObj.append(‘<img src="../img/loading.jpg" style="width:30px;" id="iloader" />‘);
        commonajax.postIISReset(ip);
        var flag = 0;
       
        iisresetpage.checkPostResult(ip, parentObj,flag);
     
    },
    checkPostResult: function (ip, parentObj, flag)
    {
         setTimeout(
           function () {
               var result = commonajax.pingServerTime(ip, function () {
                   parentObj.empty();
                   $.note(null, ip + ‘IISReset成功!‘);
                   parentObj.append(‘<button class="link resetsuccessbtn" style="margin-left:30px;"><i class="icon-checkmark fg-green" style="margin-left:45px;"></i></button>‘);
                   $(‘.resetsuccessbtn‘).click(function () {
                       iisresetpage.startReset($(this));
                   });                  
               }, function () {
                   if (flag > 10) {
                       $.note(‘Error‘, ip + ‘IISReset失败!请联系管理员处理!‘, ‘error‘);
                       parentObj.append(‘<button class="link resetfailbtn" style="margin-left:30px;"><i class="icon-cancel-2 fg-red"></i></button>‘);
                       $(‘.resetfailbtn‘).click(function () {
                           iisresetpage.startReset($(this));
                       });                  
                   }
                   else {
                       checkPostResult(ip, parentObj, ++flag);
                   }
               });
              
           }, 5000);
    },
   
    getResetLog: function (sender) {
        debugger;
        var parentObj = sender.parent();
        var ip = parentObj.prev().prev().text();
        var url = ‘/IIS/GetIISResetLog‘;
        $.Dialog({
            overlay: true,
            shadow: true,
            flat: true,
            icon: null,
            title: ‘日志‘,
            content: null,
            onShow: function (_dialog) {
                var content = _dialog.children(‘.content‘);
                content.html(‘<div style="margin:15px; width:900px;height:500px;OVERFLOW: auto;" id="ilogcontainer"></div>‘);
                chcoreui.attachLoader($(‘#ilogcontainer‘), pageid.loader, 410, 130);
                // 准备提交数据
                var pack = new Object();
                pack.ip = ip
                pack.time = "1";
                pack.Token = $.readCookie(‘accessToken‘);
                var submitData = JSON.stringify(pack);
                $.ajax({
                    type: "POST",
                    url: url,
                    data: submitData,
                    dataType: "json",
                    contentType: "application/json",
                    crossDomain: true,
                    success: function (data) {
                        if (data.StateCode == 0) {
                            var bodyContent = ‘‘;
                            $.each(data.Data, function (idx, item) {
                                bodyContent += ‘<tr><td style="text-align:center">‘ + item.Id + ‘</td><td style="text-align:center">‘ + $.convertToDateStr(item.OpTime) + ‘</td><td style="text-align:center">‘ + item.OpAlias + ‘</td><td>‘ + item.Des + ‘</td></tr>‘;
                            });
                            $(‘#ilogcontainer‘).empty();
                            $(‘#ilogcontainer‘).html(‘<table class="table bordered striped hovered dataTable" cellspacing="0" id="ilogtable"><thead><tr><th>编号</th><th>操作日期</th><th>操作人</th><th>内容</th></tr></thead><tbody>‘ + bodyContent + ‘</tbody></table>‘);
                            $(‘#ilogtable‘).dataTable({
                                "paging": true,
                                "searching": false,
                                "ordering": false,
                                "info": false,
                                "dom": ‘<"tool1bar">fr1tip‘
                            });
                        }
                    },
                    error: function (xhr, status, error) {
                        $.note(null, "获取IISRest日志失败!", "error");
                    }
                });
            }
         });
    }
};
var commonajax = {
    // Ping服务器时间
    pingServerTime: function (ip,successcallback,failcallback) {
        var url = ‘http://‘ + ip + ‘:8167/Monitor/Ping‘;
        $.ajax({
            type: "POST",
            url: url,
            dataType: "json",
            contentType: "application/json",
            crossDomain: true,
            success: function (results) {
                var reg = /\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2}:\d{2}/;
                if (reg.test(results)) {
                    successcallback();
                }
                else {
                    failcallback();
                }
            }
        });
    },
    postIISReset: function (ip) {
        var url = ‘http://‘ + ip + ‘:8167/IIS/IISReset‘;
        // 准备提交数据
        var pack = new Object();
        pack.Token = $.readCookie(‘accessToken‘);
        var submitData = JSON.stringify(pack);
        $.ajax({
            type: "POST",
            url: url,
            data: submitData,
            dataType: "json",
            contentType: "application/json",
            crossDomain: true,
            success: function (results) { },
            error: function (xhr, status, error) { }
        });
    }
}

至此,完美实现,可靠的IISRESET功能。

时间: 2024-08-05 23:13:00

C#IISRESET服务终结版的相关文章

SQL Server数据全同步及价值分析[终结版]

SQL Server数据全同步[终结版] 版权全部.转载请注明出处.谢谢! 经过两天的同步编写和測试.出了第一个Release版本号: 1. 本函数仅支持单向同步.即从一个主数据库想多个从数据库同步 2.主数据库的不论什么增删改都会同步到全部从数据库上 3. 最重要的一点:同步数据库的价值所在:当主数据库server不可用时,程序能够使用其它从数据库或者备用数据库,这对于未来公有云和私有云应用具有重大价值! 代码: <span style="font-size:18px;">

正则表达式及R字符串处理之终结版

转载于: 正则表达式及R字符串处理之终结版 0.动机:为什么学习字符串处理 传统的统计学教育几乎没有告诉过我们,如何进行文本的统计建模分析.然而,我们日常生活中接触到的大部分数据都是以文本的形式存在.文本分析与挖掘在业界中也有着非常广泛的应用. 由于文本数据大多属于非结构化的数据,要想对文本数据进行传统的统计模型分析,必须要经过层层的数据清洗与整理. 今天我们要介绍的『正则表达式及R字符串处理』就是用来干这一种脏活累活的. 与建立酷炫的模型比起来,数据的清洗与整理似乎是一种低档次的工作.如果把建

IOS之UI--小实例项目--添加商品和商品名(使用xib文件终结版) + xib相关知识点总结

*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } a { color: #4183C4; } a.absent { color: #cc0000; } a.anchor { display: block; padding-left: 30px; margin-left: -30px; cursor: pointer; position: absolute

【j2ee spring】12、整合SSH框架(终结版)

[j2ee spring]12.整合SSH框架(终结版) 最后,我们把整个项目的截图,代码发一下,大家不想下载那个项目的话,可以在这里看到所有的代码(因为那个项目需要一个下载积分,真不多= =,我觉得我搞了那么久,收点积分应该不过分吧...嘿嘿) 这里,我尽量用截图来搞,免得复制粘贴,怪烦的 一.项目整体截图 二.开始全部代码 Person.java Person.hbm.xml PersonService.java package cn.cutter_point.service; import

导出excel终结版

////////////html///////// <form  method="post"  action="{:u('order_fengqiang/index')}"  >    <table width="100%" cellspacing="0" class="search_form">        <tbody>            <tr> 

IFRAME跨域名的解决方法,终结版(小张.NET原创)[摘自 西部数码]

以前碰到此类问题很郁闷,MS为什么开发出这么个鸟IE,让这些人不得不跟着他走,后来想了想,也是,为了安全期间,还是要加上限制的,要不,别人可以随便的改你的网页内容,等等...好了,其它的废话不说了,看看下边的吧:记得要将域名指为域名,而不是WWW或者其它的,例:shagndu8.com 而不能指向www.shangdu8.com 1.请在父网页上加上以下代码:1<SCRIPT LANGUAGE="VBScript">2    document.domain = "

Spring Security实现OAuth2.0授权服务 - 进阶版

<Spring Security实现OAuth2.0授权服务 - 基础版>介绍了如何使用Spring Security实现OAuth2.0授权和资源保护,但是使用的都是Spring Security默认的登录页.授权页,client和token信息也是保存在内存中的. 本文将介绍如何在Spring Security OAuth项目中自定义登录页面.自定义授权页面.数据库配置client信息.数据库保存授权码和token令牌. 一.引入依赖 需要在基础版之上引入thymeleaf.JDBC.my

安全狗服云web端V3.4(企业服务)版上线

7月3号,服务器安全运维云平台--服云web端V3.4(企业服务)版正式更新上线啦!http://fuyun.safedog.cn/ 企业服务全为了了解并解决企业安全需求而定制.通过这个功能,企业用户可以提出自己所需的所有安全需求,反馈给我们,然后我们将根据用户所提出的需求定制出用户所需的版本,具有针对性地解决用户的安全问题. 6 小时前 上传 服云web端V3.4具体更新内容: 1.优化企业服务内容在界面上的展示,便于用户快速申请.升级企业服务 2.在企业服务中增加安全服务内容 3.升级企业服

GitHub使用终结版

前言:从2013年第一次听过github,到2014年开始正式接触学习,途中一直都很迷惘,始终没搞明白这到底是个什么东西,到底怎么玩,可能是一开始就没搞清楚git和github的区别,记得一开始看了很多文档和视频,可始终是一头雾水,搞半天只学会了拉代码,不会上传,但功夫不负有心人最终我还是学会了,感谢那个曾经一直很努力的自己吧.本文会讲述我遇到的坎,以及各位朋友曾向我提到的问题. 一.git和github的区别 git是一种版本控制系统.跟svn.cvs是同级的概念. github是一个网站,给