只有累積,沒有奇蹟

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 
  1. using Microsoft.Web.Administration;
  2.  
  3. [HttpGet]
  4. [Route("RestartApplication")]
  5. public string RestartApplication()
  6. {
  7. try
  8. {
  9. ServerManager serverManager = new ServerManager();
  10. ApplicationPool appPool = serverManager.ApplicationPools["WebAPI"];
  11. if (appPool != null)
  12. {
  13. if (appPool.State == ObjectState.Stopped)
  14. {
  15. appPool.Start();
  16. }
  17. else
  18. {
  19. appPool.Recycle();
  20. }
  21. }
  22.  
  23. return "success";
  24. }
  25. catch (Exception e)
  26. {
  27. return $"fail , ex:{e.Message}";
  28. throw;
  29. }
  30. }
  31. [HttpGet]
  32. [Route("GetApplicationPoolTime")]
  33. public string GetApplicationPoolTime()
  34. {
  35. var time = DateTime.Now - Process.GetCurrentProcess().StartTime;
  36. return time.ToString();
  37. }
程式說明 : 
  • 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 語法來回收
  1. Import-Module WebAdministration
  2. # Set a name of the site we want to recycle the pool for:
  3. $site = "WebAPI"
  4. # Get pool name by the site name:
  5. $pool = (Get-Item "IIS:\Sites\$site"| Select-Object applicationPool).applicationPool
  6. # Recycle the application pool:
  7. Restart-WebAppPool $pool
驗證

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

參考
How to Use Microsoft.Web.Administration

Related Posts:

  • [NETCore] ASP.NET Core 建立排程服務 - 使用 Generic Host 搭配 Quartz.Net - Part 1前言 最近有個需求是固定時間取得特定資料進行修改,在查詢相關資料之後決定使用 ASP.NET Core Generic Host 為出發,在搭配 .NET 中熱門的排程套件 Quartz.Net,測試完畢之後再將程式註冊為 Windows Service 服務就可滿足使用者的需求,這篇文章是整理開發時的重點流程為系列文,給有需要使用 ASP.NET Core 開發排程相關應用程式需求的朋友一些參考,若有問題或是錯誤的地方歡迎各位高手給予… Read More
  • [Azure] App Service Diagnostics - Collect Memory Dump 前言 前兩篇分別介紹了 App Service Diagnostics 中的 Collect .Net Profiler Trace 與 Auto heal,分別都可以透過工具來蒐集雲端伺服器的緩慢問題分析與蒐集記憶體資訊,這一篇則是介紹如何 dump 目前伺服器 memory 的資料,以及有多個伺服器的時候該如何抓取特定的 Server memory data。若對於上述內容有問題或是不清楚的地方,歡迎提出來一起討論。 Colle… Read More
  • [NETCore] 如何在 ASP.NET Core Middleware 加上單元測試 Unititest前言 Middleware 在 ASP.NET Core 開發時是個很常見的功能,概念很像 ASP.NET Application Life cycle 管線的 Handler 機制 (若對於 Life Cycle 想了解更多可以看之前寫的文章 Application Life Cycle),提供開發者可以在 Request 進入到 Application 前加上客製化的邏輯,實務上用起來挺方便的也蠻好用的,在加上 middleware 相關… Read More
  • [Free] 更新 ASP.NET Core 的兩三事 電子書 前言 之前有整理 ASP.NET Core 相關文章變成一本電子書 Something about ASP.NET Core 並放在 Github 上供人自行取用 (詳細可以參考 這篇 文章),去年也有撰寫一些相關的議題因此在過年期間也針對電子書做更新,新增的內容及章節如下 建立 Azure Container Registry 並整合 Microsoft Team 通知 如何在 ASP.NET Core Midd… Read More
  • [conference] .NET Conf 2021 - 初探 OpenTelemetry - 蒐集遙測數據的新標準 分享心得 參加好幾屆 .NET Conf 每次都是收穫滿滿,今年被主辦單位也是技術管理者論壇志工 Kyle 推坑在 .NET 年度盛會邀請分享,原本十分不好意思但想到之前已經有在 COSCUP 與 MOPCON 分享過兩場,於是決定分享最近有興趣的議題 OpenTelemetry 開源框架, 依舊保持緊張就斷片的正常發揮,在一開始主持人介紹完開場就立刻忘詞 (掉漆again),很高興可以參予 Study4.TW 10年盛會,可以有機會在講師… Read More

0 意見:

張貼留言

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

Design by Anders Noren | Blogger Theme by NewBloggerThemes.com