最近常聽維運同仁在群組提到某應用程式在尖峰時間 CPU 與 Memory 持續飆高,處理方式都是通知 RD 同仁連回公司將 App Pool 進行回收的動作,雖然可以暫時解決問題但如果提供工具讓維運同仁可以自行回收的動作,相信可以讓雙方節省更多的時間,這種方式屬於 work around,如果很頻繁發生代表 Code 有問題要找出 root cause 才是正解
Recyle Application
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驗證
權限不足
傳送們 : redirection.config 錯誤: 無法讀取設定檔案,因為權限不足
參考
How to Use Microsoft.Web.Administration
0 意見:
張貼留言