星期二, 3月 26, 2024

[.NET] 在 Windows Service 內使用 EFCore

把 BackgroundService 安裝成 Windows Service 實際上線時,遇上下列三種跟 EFCore 相關問題,分別為
  • 抓取 appsettings.josn
  • SQL Server 連線驗證方式
  • Microsoft.Data.SqlClient 安裝

抓取 appsettings.josn

一開始沿用該筆記內容 - [EFCore] 在 Console 專案上安裝設定,使用 Directory.GetCurrentDirectory() 來取得,但當變成 Windows Service 後,回傳值會變成 C:\Windows\system32,完整錯誤訊息如下
The configuration file 'appsettings.json' was not found and is not optional. The expected physical path was 'C:\Windows\system32\appsettings.json'.
最後修正為使用 AppContext.BaseDirectory 才正確取得執行檔案資料夾位置,參考資料
SQL Server 連線驗證方式

因為是使用 Windows 驗證,在 VS 上測試時是使用 [Windows 登入帳號],但當變成 Windows Service 後,變成為 NT AUTHORITY\SYSTEM,看是要在 SQL Server 內允許帳戶有存取權限或是該使用 SQL 驗證來存取

一開始收到的錯誤訊息如下,完全不知道為什麼要設定 EnableRetryOnFailure
An exception has been raised that is likely due to a transient failure. Consider enabling transient error resiliency by adding 'EnableRetryOnFailure' to the 'UseSqlServer' call.
Windows 服務 => Windows Service 內查詢使用帳號


SQL Server => 安全性 => 報表 => 標準報表 => 登錄失敗



Microsoft.Data.SqlClient 安裝

執行時拋出該錯誤訊息
The type initializer for 'Microsoft.Data.SqlClient.TdsParser' threw an exception.
關鍵字明確,去 nuget 上把 Microsoft.Data.SqlClient 安裝起來就解決

沒有留言:

張貼留言