当IIS没有响应时自动重启IIS

时间:2016-08-09 05:45:26

标签: c# iis

这是一个最佳实践问题。我做了一个小的c#命令行程序,我每15分钟运行一次,使用HttpWebRequest和HttpWebResponse检查一个URL,如果他们没有回答OK状态我用Process.Kill来结束名为“w3wp”的进程,这就是什么我会做正常的,只是杀死进程并让它们重新启动比通过IIS管理器并回收应用程序池更快。有一些旧的遗留软件在我们迁移后与IIS8无法解决问题,有时它可能会持续几个月没有停滞,有时它可能每周都会发生。真的不知道如何解决它,我的老板也不想让我花时间在上面,所以我做了这个kludge / workaround。

case "alive":

                        Console.WriteLine("Check if website(s) respond:");
                        bool restartIIS = false;
                        List<string> checkURL;
                        checkURL = new List<string>();
                        checkURL.Add("http://www.test.se");
                        checkURL.Add("http://www.test.fi");
                        checkURL.Add("http://www.test.com");

                        foreach (string value in checkURL)
                        {                            
                            HttpWebRequest req = (HttpWebRequest)WebRequest.Create(value);
                            HttpWebResponse response = (HttpWebResponse)req.GetResponse();
                            if (response.StatusDescription.Equals("OK"))
                            {
                                Console.WriteLine("Website (" + value +") is up");
                            }
                            else
                            {
                                Console.WriteLine("Website is down, restarting IIS");
                                restartIIS = true;
                            }
                            response.Close();


                            if (restartIIS == true)
                            {
                                foreach (var process in Process.GetProcessesByName("w3wp"))
                                {
                                    process.Kill();
                                }
                                sendDowntimeAlert();
                                //function that sends me an email notifcation
                            }
                    }
                    break;

我只是想知道是否有更好的方法来处理重启IIS。手动回收应用程序池往往会起作用,所以也许这比杀死进程更好?或者,如果这种方法有用的话,这有多重要吗?

2 个答案:

答案 0 :(得分:2)

我想提供powershell代码I&#34;写道&#34; (为了完整起见,我主要通过stackoverflow获取样本,我已经修改并重写了,也许有人认出了他的工作)。这就是我现在这样做的方式。使用任务计划程序每15分钟运行一次。还决定添加日志。

param([string]$emailNotify, [string]$checkUrl)

$CurrentDate = [DateTime]::UtcNow.ToString('u')
$Logfile = "C:\scheduled-tasks\powershell\IISkeepalive.log"
Function LogWrite
{
   Param ([string]$logstring)

   Add-content $Logfile -value $logstring
}

Function Mailer($emailTo, $checkUrl) 
{ 
$message = "Website: (" + $checkUrl + ") appears to be down" 
$emailFrom = "info@recipient.com" 
$subject="website may be down" 
$smtpserver="smtp.server.com" 
$smtp=new-object Net.Mail.SmtpClient($smtpServer) 
$smtp.Send($emailFrom, $emailTo, $subject, $message) 
} 

Function testWebsite($emailTo, $checkUrl)
{
# First we create the request.
$HTTP_Request = [System.Net.WebRequest]::Create($checkUrl)

# We then get a response from the site.
$HTTP_Response = $HTTP_Request.GetResponse()

# We then get the HTTP code as an integer.
$HTTP_Status = [int]$HTTP_Response.StatusCode

If ($HTTP_Status -eq 200) { 
    LogWrite ("<" + $CurrentDate + "> Site (" + $checkUrl + ") is OK")
}
Else {
    LogWrite ("<" + $CurrentDate + "> The site (" + $checkUrl + ") may be down, please check!")
    Mailer $emailTo $checkUrl
    Start-Sleep -s 1

    Invoke-Command -ComputerName "SERVER" -ScriptBlock { Restart-WebAppPool "PoolName1" }
    Start-Sleep -s 1
    Invoke-Command -ComputerName "SERVER" -ScriptBlock { Restart-WebAppPool "PoolName2" }
    LogWrite ("<" + $CurrentDate + "> Application pools recycled")
}

# Finally, we clean up the http request by closing it.
$HTTP_Response.Close()
}

testWebsite $emailNotify $checkUrl

答案 1 :(得分:0)

首先,您没有重新启动IIS,而是要杀死一个应用程序池进程。

IIS有几个组件,可以运行许多应用程序池,因此如果您知道问题在该应用程序池中,则重新启动应用程序池而不是整个服务是个好主意。

正如您所说,与杀死基础流程相比,回收AppPool是更好的选择。当您回收时,当前正在执行的请求已完成,并且该过程以适当的方式关闭,而不是仅仅被杀死。

当使用C#查看Microsoft.Web.Administration命名空间时,大多数IIS都可以通过API访问。应该有关于如何回收AppPool的例子。

或者你可以写一个小的PowerShell脚本,它做同样的事情。通常,管理员更喜欢脚本而不是黑盒可执行文件。

P.S。我只看了你的代码,你实际上是在杀死所有的应用程序池,即使它们与你的有问题的站点无关,这可能在你的服务器上没问题但在共享多个应用程序/站点的服务器上会非常糟糕。 / p>

相关问题