只有累積,沒有奇蹟

2019年4月29日 星期一

[.NETCore] Windows Service - 服務並未以適時的方式回應啟動或控制請求。

前言
在上一篇有提到如何使用指令 註冊 Window Service 服務,提到了如何用指令操作 Windows Service 看啟用的狀態,但有時在啟動時會發生錯誤造成啟動失敗的狀況發生,舉例來說在啟動服務時跳出  'Windows 無法啟動,本機電腦的 TestService 服務,錯誤 1503 : 服務並未已適時的方式回應啟動獲控制請求。 這篇要說明的是在註冊服務當下發生異常的處理方式若有問題歡迎提出一起討論或是給予指導。

解決方案
首先第一步要知道啟動失敗的原因,當 Windows Service 在啟動服務失敗時,會透過 GetLastError函數回傳錯誤訊息,並將其錯誤原因與錯誤代碼做 mapping,因此在錯誤訊息中可以看到錯誤代碼 1053,每個錯誤代碼背後都代表特定錯誤原因,可以透過清單查詢代碼對應的錯誤原因 傳送門
在 1053 對應的錯誤訊息為 : The service did not respond to the start or control request in a timely fashion.,疑似執行的程式內容並未執行正確,錯誤訊息內容太籠統無法得到處理方向,因此進行下一步處理。

事件檢視器
事件檢視器 Event Viewer 是提供使用者查看電腦中發生大大小小事情的工具,Server 的啟動關閉紀錄、IIS 站台的狀況、或是當應用程式忽然異常時都會將其 Log 資訊寫到事件檢視器中,因此當 Windows Service 啟動失敗時,也可以使用事件檢視器來查看可能異常的原因,開啟方式為在左下角開始,輸入 Event 並按下 Enter
可以透過時間搜尋發生問題的當下系統中的 log 資訊,可以發現啟動時 Windows Service 紀錄的錯誤為 服務並未以適當的方式回應啟動或控制請求,根本原因是等候 TestService 服務連線時發生逾時 (30000 毫秒) 造成
回到代碼發現舊有的代碼 Console 應用程式在啟動時並未加上 Log 紀錄,因此在 Console 進入點 main 方法加上 StreamWriter 加入 log 尋找可能錯誤原因,另外在與同事討論後提到 Serilog 在作為 Windows Service 時要特別注意 Log 路徑問題,建議在使用 Serilog 在啟動時加上指定路徑,因此在 Initial Log 時加入下列代碼
  1. private static void InitialLogging()
  2. {
  3. var pathToExe = Process.GetCurrentProcess().MainModule.FileName;
  4. var pathToContentRoot = Path.GetDirectoryName(pathToExe);
  5. Directory.SetCurrentDirectory(pathToContentRoot);
  6.  
  7. Log.Logger = new LoggerConfiguration()
  8. .MinimumLevel.Debug()
  9. .WriteTo.Console()
  10. .WriteTo.File("logs/App_.txt", rollingInterval: RollingInterval.Day)
  11. .CreateLogger();
  12. }
接著在開啟 cmd 輸入指令重新啟動 Windows Service,指令為  start ServiceName  要啟動時狀態為 START_PENDING (2)
  1. D:\>sc start testservice
  2.  
  3. SERVICE_NAME: testservice
  4. TYPE : 10 WIN32_OWN_PROCESS
  5. STATE : 2 START_PENDING
  6. (NOT_STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN)
  7. WIN32_EXIT_CODE : 0 (0x0)
  8. SERVICE_EXIT_CODE : 0 (0x0)
  9. CHECKPOINT : 0x0
  10. WAIT_HINT : 0x7d0
  11. PID : 26300
  12. FLAGS :
當啟動完畢之後,狀態就會更新為 RUN (4) 
  1. SERVICE_NAME: testservice
  2. TYPE : 10 WIN32_OWN_PROCESS
  3. STATE : 4 RUNNING
  4. (STOPPABLE, NOT_PAUSABLE, ACCEPTS_SHUTDOWN)
  5. WIN32_EXIT_CODE : 0 (0x0)
  6. SERVICE_EXIT_CODE : 0 (0x0)
  7. CHECKPOINT : 0x0
  8. WAIT_HINT : 0x0
服務啟動正常除蟲完畢,打完收工 !!

參考
powershell create windows service

Related Posts:

  • [.NETCore] Windows Service - 服務並未以適時的方式回應啟動或控制請求。前言 在上一篇有提到如何使用指令 註冊 Window Service 服務,提到了如何用指令操作 Windows Service 看啟用的狀態,但有時在啟動時會發生錯誤造成啟動失敗的狀況發生,舉例來說在啟動服務時跳出  'Windows 無法啟動,本機電腦的 TestService 服務,錯誤 1503 : 服務並未已適時的方式回應啟動獲控制請求。 這篇要說明的是在註冊服務當下發生異常的處理方式,若有問題歡… Read More
  • [NETCore] 結構化日誌 Serilog - Events Types 和 Enrichment 前言 前兩篇分別介紹了關於 Serilog 的基礎應用與設定,這篇就來針對事件類型 Event Type 與 介紹幾個常用的 Enricher,若有問題或是錯誤的地方歡迎提出來一起討論。 Event Type 結構化日誌的好處是可以清楚的分辨"每一次"紀錄的事件,舉例來說下列簡單的代碼是透過 Serilog 寫入log 到 Console 與 File 檔案,紀錄內容是 3 筆資料 Log.Logger = new LoggerCo… Read More
  • [NETCore] 結構化日誌 Serilog - 配置設定 前言 上一篇在 結構化日誌 Serilog 初體驗 介紹了關於 Serilog 的基本操作,這篇是針對 Serilog 在 ASP.NET Core 的設定與 Config 做進一步的介紹,若有問題或是錯誤的地方歡迎提出來一起討論或是給予指導。 基本使用 首先先來回顧一下基本使用方式,在 Serilog 如果要紀錄 Log 資訊必須使用  LoggerConfiguration&n… Read More
  • [NETCore] 結構化日誌 Serilog 初體驗前言 在 .NET 使用日誌框架第一時間會想到 NLog 或是 Log4Net 兩種 Log 常使用的 Library,Serilog 是這幾年快速崛起的 Log 框架之一,Serilog 是以 Structured logging 為基礎進行設計,透過 logging API 可以輕鬆的記錄應用程式中對象屬性,方便快速進行 logging 內容進行查詢與分析,並將其紀錄內容透過 json (可指定) 的方式輸出,這篇就介紹 … Read More
  • [NETCore] 在 ASP.NET Core Web API 中使用 Serilog 前言 近期專案都在嘗試 Serilog,對於使用上有點小小心得,因此整理這篇文章分享 Serilog 在 ASP.NET Core API 上的使用與設定,也接續之前 Serilog 的系列介紹文 : 傳送門 的實際應用心得,希望可以幫到有需要的朋友,若有問題或是錯誤的地方歡迎提出來一起討論或是給予指導。 ASP.NET Core logging 首先先建立新的 ASP.NET Core Web Applicat… Read More

0 意見:

張貼留言

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

Design by Anders Noren | Blogger Theme by NewBloggerThemes.com