分類: Azure Functions

使用Rider Debug Azure Function專案遇到的怪異問題,ex. 找不到System.IO.Pipelines 5.0.0, 無法解析FileLoggingStatusManager

使用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

image.png

Debug時,若是出現無法連到儲存體的話,若只是開啟emulator的話,也是不行

The listener for function ‘ActivateUserJob’ was unable to start. Microsoft.Azure.Storage.Common: 無法連線,因為目標電腦拒絕連線。. System.Net.Http: 無法連線,因為目標電腦拒絕連線。. System.Private.CoreLib: 無法連線,因為目標電腦拒絕連線。.

https://docs.microsoft.com/zh-tw/azure/storage/common/storage-use-emulator#how-the-storage-emulator-works
image.png

會出現 Server encountered an internal error
image.png

2.azurite將取代Azure Storage Emulator

https://docs.microsoft.com/zh-tw/azure/storage/common/storage-use-azurite#run-azurite-from-a-command-line

  • 使用 NPM 安裝和執行 Azurite
    npm install -g azurite
  • 啟用windows的azurite
    **azurite --silent --location c:\azurite --debug c:\azurite\debug.log**
  • 跑起來azurite的樣子:
    image.png

總算可以了!

3.透過DI註冊到Azure Functions

class可以註冊覆寫這個Function

public override void Configure(IFunctionsHostBuilder builder)
public override void ConfigureAppConfiguration(IFunctionsConfigurationBuilder builder)
在覆寫的時候,可以去將ServiceProvider重新指定
var configBuilder = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("local.settings.json", true, true)
                .AddEnvironmentVariables();

            var builderTemp = new FunctionsHostBuilder();
            builderTemp.Services = new ServiceCollection();

            builder = builderTemp;

            var configurationRoot = configBuilder.Build();
            builder.Services.AddSingleton<IConfiguration>(provider =>
            {
                return configurationRoot;
            });

怪異問題集

1.找不到System.IO.Pipelines 5.0.0版(nuget明明有裝)
image.png
解法:
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
image.png

Replace掉該介面的實作
image.png