使用Rider Debug Azure Function專案遇到的怪異問題,ex. 找不到System.IO.Pipelines 5.0.0, 無法解析FileLoggingStatusManager
為什麼要特別記錄這次的案例,主要Azure Functions若順順著用,不要想什麼DI,也是挺單純,就是一個Function,像是Console一樣跑進去嘛
但是為了實踐DI設計,當然主要就是為了單元測試,把相依物件隔離,本來也沒事,UT寫的好好的,整測去Trigger容器註冊也解決了,結果實際拿Azure Function專案Debug時,
除了AzureFunction剛好是Static Class,在想有哪些切入點可以註冊事件,然後不明究理的去開始debug他,結果發生了以下諸多問題
a.Azure 儲存體相依
b.DI容器註冊問題
c.Runtime在跑的時候其他元件相依問題
在此記錄一下解法!
1.Rider要先安裝azure functions core tools
Debug時,若是出現無法連到儲存體的話,若只是開啟emulator的話,也是不行
The listener for function ‘ActivateUserJob’ was unable to start. Microsoft.Azure.Storage.Common: 無法連線,因為目標電腦拒絕連線。. System.Net.Http: 無法連線,因為目標電腦拒絕連線。. System.Private.CoreLib: 無法連線,因為目標電腦拒絕連線。.
會出現 Server encountered an internal error
2.azurite將取代Azure Storage Emulator
- 使用 NPM 安裝和執行 Azurite
npm install -g azurite
- 啟用windows的azurite
**azurite --silent --location c:\azurite --debug c:\azurite\debug.log**
- 跑起來azurite的樣子:
總算可以了!
3.透過DI註冊到Azure Functions
class可以註冊覆寫這個Function
public override void Configure(IFunctionsHostBuilder builder)
public override void ConfigureAppConfiguration(IFunctionsConfigurationBuilder builder)
在覆寫的時候,可以去將ServiceProvider重新指定
怪異問題集
1.找不到System.IO.Pipelines 5.0.0版(nuget明明有裝)
解法:
https://stackoverflow.com/questions/65382540/azure-function-app-could-not-load-system-io-pipelines-connecting-to-redis
2.無法解析FileLoggingStatusManager
可以想像是AzureFunction在初始化注入DI的時候無法找到相對應的類別
但我看其他專案不會有這種錯,而且我在整合測試專案時,已經塞過也可作了
但一到AzureFunction跑起來的時候就怪怪的,猜想是跟容器本身有關
因此我在Startup的時候,重新初始化ServiceCollection塞進去。
但是若要塞新的ServiceCollection,就必須實作把setter改掉!
實作IFunctionHostBuilder
Replace掉該介面的實作