只有累積,沒有奇蹟

2019年1月14日 星期一

[.NET] 使用 WebAPI 回收 Application Pool

說明
最近常聽維運同仁在群組提到某應用程式在尖峰時間 CPU 與 Memory 持續飆高,處理方式都是通知 RD 同仁連回公司將 App Pool 進行回收的動作,雖然可以暫時解決問題但如果提供工具讓維運同仁可以自行回收的動作,相信可以讓雙方節省更多的時間這種方式屬於 work around如果很頻繁發生代表 Code 有問題要找出 root cause 才是正解 

Recyle Application
以下就簡單介紹使用如何透過 ASP.NET 及 Powershell 指令的方式將應用程式進行回收
ASP.NET 
如果想要透過程式操作 IIS 可以透過 Microsoft.Web.Administration 來對 Web Server 進行操作,可以透過 dll 的 API 來修改 XML 配置文件及管理 IIS 中的 Web sites, application pools, worker processes,詳細可以參考 MSDN 說明 How to Use Microsoft.Web.Administration,今天要使用的是回收Application 功能,因此需要透過 ServerManager 對相對物件進行操作,在使用前須要先透過 nuget 進行安裝,簡單步驟如下
Step 1 : 在 Visual Studio 右上角搜尋 nuget 
Step 2 : 在 nuget 輸入 Microsoft.Web.Administrationrs 並進行安裝
廢話不多說,直接上 Code 
using Microsoft.Web.Administration;

[HttpGet]
[Route("RestartApplication")]
public string RestartApplication()
{
    try
    {
     ServerManager serverManager = new ServerManager();
     ApplicationPool appPool = serverManager.ApplicationPools["WebAPI"];
     if (appPool != null)
     {
            if (appPool.State == ObjectState.Stopped)
     {
      appPool.Start();
     }
     else
     {
      appPool.Recycle();
     }
 }

 return "success";
    }
    catch (Exception e)
    {
        return $"fail , ex:{e.Message}";
 throw;
    }
}
[HttpGet]
[Route("GetApplicationPoolTime")]
public string GetApplicationPoolTime()
{
    var time = DateTime.Now - Process.GetCurrentProcess().StartTime;
    return time.ToString();
}
程式說明 : 
  • Line 1 : 需要先 using Microsoft.Web.Administration 才能使用相關 API
  • Line 9-10 : 透過 ServerManager 取得 App Pool 是 WebAPI 的應用程式
  • Line 15-19 : 對 WebAPI 應用程式重開 / 啟用
  • Line 33-36 : 透過此接口取得 Application 取得 process 運行的時間
Powershell
也可以使用 Jenkins 內使用 powershell 語法來回收
Import-Module WebAdministration
# Set a name of the site we want to recycle the pool for:
$site = "WebAPI"
# Get pool name by the site name:
$pool = (Get-Item "IIS:\Sites\$site"| Select-Object applicationPool).applicationPool
# Recycle the application pool:
Restart-WebAppPool $pool
驗證

權限不足
在使用 Microsoft.Web.Administration 中可能會遇到權限不足則需要在對 IIS ApplicationPoolIdentity 進行設定
傳送們 : redirection.config 錯誤: 無法讀取設定檔案,因為權限不足

參考
How to Use Microsoft.Web.Administration

0 意見:

張貼留言

Copyright © m@rcus 學習筆記 | Powered by Blogger

Design by Anders Noren | Blogger Theme by NewBloggerThemes.com