Windows 服务开发 以及 重启IIS应用池

Posted 魔鬼清

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Windows 服务开发 以及 重启IIS应用池相关的知识,希望对你有一定的参考价值。

前言:最近公司部署的IIS项目应用池间断性停止,导致程序死掉,如下图

如果不能及时重启,会导致很严重的后果。所以我耗时5分钟开发了这个服务,用于监听应用程序池的应用状态并重启。

一、windows 服务

  1、打开vs,新建windows服务程序(本实例使用vs 2019)。

 2、点击MyServices.cs[设计]界面的切换到代码视图

两个默认的方法OnStart和OnStop,顾名思义就是服务启动和停止的事件(自行按需写业务,其他方法请查阅官方文档)

public partial class IISRestart : ServiceBase
    {
        public IISRestart()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {
            // TODO:  在此处添加代码以启动服务。
            var timer = new Timer(1000 * 60) { AutoReset = true, Enabled = true }; //间隔1分钟
            timer.Elapsed += timer_Elapsed;
            timer.Start();
        }

        protected override void OnStop()
        {
        } 
        // 遍历应用程序池的应用,如果停止就重启
        private void timer_Elapsed(object sender, ElapsedEventArgs e)
        {
            var manager = new Microsoft.Web.Administration.ServerManager();
            System.Threading.ThreadPool.QueueUserWorkItem((state) =>
            {
                while (true)
                {
                    var pools = manager.ApplicationPools;
                    foreach (var pool in pools)
                    {
                        if (pool.State == Microsoft.Web.Administration.ObjectState.Stopped)
                            pool.Start();
                    } 
                }
            });
        }
    }

 3、在MyServices.cs[设计]界面右击,选择“添加安装程序”

 

 

 4、单击ProjiectInstall.cs文件,然后单击serviceProcessInstaller1,属性栏的"Account"按需修改,我选择的"LocalSystem",

单击serviceInstall1(如上图),属性栏的SartType按需设置,我选择的"Automatic"

然后"Description"和"DisplayName"就是服务的名字和显示内容了

5、生成解决方案,右击项目,选择属性,在"应用程序"选项卡中把"启动对象"改为"WindowsService.Program"

 6、①安装服务,找到项目的"bin\\debug"路径

 

 把"InstallUtil.exe"复制到debug下(框选的文件)。InstallUtil默认在"C:\\Windows\\Microsoft.NET\\Framework\\版本号"下

 以管理员身份打开cmd。路径为debug文件夹,输入"InstallUtil 应用程序名称.exe"即可安装服务

 卸载应用程序为"InstallUtil /u 应用程序名称.exe"

②程序安装

1、新建winfoirm程序,拖动4个按钮,如下图:

 

配置服务路径以及名称

string serviceFilePath = $"{Application.StartupPath}\\\\服务项目.exe";
string serviceName = "服务名称";

 2、按钮事件

 1        //事件:安装服务
 2         private void btn_install_Click(object sender, EventArgs e)
 3         {
 4             if (this.IsServiceExisted(serviceName)) this.UninstallService(serviceFilePath);
 5             this.InstallService(serviceFilePath);
 6         }
 7 
 8         //事件:卸载服务
 9         private void btn_uninstall_Click(object sender, EventArgs e)
10         {
11             if (this.IsServiceExisted(serviceName))
12             {
13                 this.ServiceStop(serviceName);
14                 this.UninstallService(serviceFilePath);
15             }
16         }
17         //事件:启动服务 
18         private void btn_start_Click(object sender, EventArgs e)
19         {
20             if (this.IsServiceExisted(serviceName)) this.ServiceStart(serviceName);
21         }
22         //事件:停止服务
23         private void btn_stop_Click(object sender, EventArgs e)
24         {
25             if (this.IsServiceExisted(serviceName)) this.ServiceStop(serviceName);
26         }     

按钮业务

        //安装服务  
        private void InstallService(string serviceFilePath)
        {
            using (AssemblyInstaller installer = new AssemblyInstaller())
            {
                installer.UseNewContext = true;
                installer.Path = serviceFilePath;
                IDictionary savedState = new Hashtable();
                installer.Install(savedState);
                installer.Commit(savedState);
                MessageBox.Show("安装成功");
            }
        }

        //卸载服务  
        private void UninstallService(string serviceFilePath)
        {
            using (AssemblyInstaller installer = new AssemblyInstaller())
            {
                installer.UseNewContext = true;
                installer.Path = serviceFilePath;
                installer.Uninstall(null);
                MessageBox.Show("卸载成功");
            }
        }
        //启动服务  
        private void ServiceStart(string serviceName)
        {
            using (ServiceController control = new ServiceController(serviceName))
            {
                if (control.Status == ServiceControllerStatus.Stopped)
                {
                    control.Start();
                    MessageBox.Show("启动成功");
                }
            }
        }

        //停止服务  
        private void ServiceStop(string serviceName)
        {
            using (ServiceController control = new ServiceController(serviceName))
            {
                if (control.Status == ServiceControllerStatus.Running)
                {
                    control.Stop();
                    MessageBox.Show("停止成功");
                }
            }
        } 
View Code

完结!

 

以上是关于Windows 服务开发 以及 重启IIS应用池的主要内容,如果未能解决你的问题,请参考以下文章

windows2008设置IIS服务器定时自动重启的方法

iis占内存90%重启iis怎么做

ASP.NET C# 如何在程序中控制IIS服务或应用程序池重启?

Windows server2003 下IIS问题:Windows server2003 下IIS每隔一段时间就不能运行了,必须得重启服务器

windows server 2012 设置IIS服务器定时自动重启的方法

配置iis的时候一键控制iis开关的方法