【Azure Durable Function】PowerShell Activity 函數遇見 Newtonsoft.Json.JsonReaderException: The reader'

2023-11-09 06:01:25

問題描述

建立PowerShell Azure Durable Function,執行大量的PowerShell指令碼操作Azure Resource,遇見了一個非常非常奇怪的問題:

Function 'Hello1 (Activity)' failed with an error. Reason: Newtonsoft.Json.JsonReaderException: The reader's MaxDepth of 64 has been exceeded. Path '[9].Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.StorageAccount.BlobStorageUri', line 1, position 103037.

at Newtonsoft.Json.JsonReader.Push(JsonContainerType value)

at Newtonsoft.Json.JsonTextReader.ParseValue()

at Newtonsoft.Json.JsonWriter.WriteToken(JsonReader reader, Boolean writeChildren, Boolean writeDateConstructorAsDate, Boolean writeComments)

at Newtonsoft.Json.Linq.JTokenWriter.WriteToken(JsonReader reader, Boolean writeChildren, Boolean writeDateConstructorAsDate, Boolean writeComments)

Stack: .

 

問題解答

Function 'Hello1 (Activity)' failed with an error. Reason: Newtonsoft.Json.JsonReaderException: The reader's MaxDepth of 64 has been exceeded. 
Path
'[9].Context.
Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.
Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.
Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.
Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.
Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.
Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.
StorageAccount.BlobStorageUri', line 1, position 103037. at Newtonsoft.Json.JsonReader.Push(JsonContainerType value)

 

因為異常中的Stack並沒有指明是那一句程式碼引起的異常,所以只好使用最笨的辦法。

一行程式碼一行程式碼的偵錯。

最終,在對程式碼進行逐句逐句的註釋後執行,定位到是 New-AzStorageAccount的問題。當註釋掉這一句後,問題消失。

New-AzStorageAccount -ResourceGroupName $rgName -Name $storageName -SkuName Standard_LRS -Location $region -AllowBlobPublicAccess $false  

 但是,為什麼它會導致Function App執行出現如此詭異的問題呢?

 

問題原因

 

(單獨執行 New-AzStorageAccount 程式碼,發現它的輸出資訊為一個表格物件)

 

Durable Function會把執行的輸出進行轉換為JSON Object並儲存在Activity 函數的紀錄檔中。

因為Function Runtime在轉換這個物件時,觸發了Newtonsoft.Json.JsonReaderException: The reader's MaxDepth of 64 has been exceeded. 異常。 就是這個物件的深度達到了JSON的最大深度64。

 

解決辦法

基於問題原因,可以主動修改New-AzStorageAccount 的結果輸出,可以把輸出到檔案中,或者轉換為 JSON格式,來避免問題。

方式一:把輸出資訊儲存為檔案,在命令後加上*> script.log

New-AzStorageAccount -ResourceGroupName $rgName -Name $storageName -SkuName Standard_LRS -Location $region -AllowBlobPublicAccess $false *> script.log

 

方式二:把輸出物件轉換為JSON, 在命令後加上| ConvertTo-Json

New-AzStorageAccount -ResourceGroupName $rgName -Name $storageName -SkuName Standard_LRS -Location $region -AllowBlobPublicAccess $false | ConvertTo-Json

 

經測試,兩種方式都可以解決問題。