5

【Azure Durable Function】PowerShell Activity 函数遇见 Newtonsoft.Json.JsonReade...

 10 months ago
source link: https://www.cnblogs.com/lulight/p/17818283.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

【Azure Durable Function】PowerShell Activity 函数遇见 Newtonsoft.Json.JsonReaderException: The reader's MaxDepth of 64 has been exceeded.

创建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: .

2127802-20231108210534306-1862614599.png
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并没有指明是那一句代码引起的异常,所以只好使用最笨的办法。

一行代码一行代码的调试。

2127802-20231108210533733-133383578.png

最终,在对代码进行逐句逐句的注释后执行,定位到是 New-AzStorageAccount的问题。当注释掉这一句后,问题消失。

New-AzStorageAccount -ResourceGroupName rgName−NamestorageName -SkuName Standard_LRS -Location region−AllowBlobPublicAccessfalse  

 但是,为什么它会导致Function App执行出现如此诡异的问题呢?

 

2127802-20231108210533517-721338464.png

(单独执行 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−NamestorageName -SkuName Standard_LRS -Location region−AllowBlobPublicAccessfalse *> script.log

方式二:把输出对象转换为JSON, 在命令后加上| ConvertTo-Json

New-AzStorageAccount -ResourceGroupName rgName−NamestorageName -SkuName Standard_LRS -Location region−AllowBlobPublicAccessfalse | ConvertTo-Json

经测试,两种方式都可以解决问题。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK