首页 > 系统相关 >【Azure Durable Function】PowerShell Activity 函数遇见 Newtonsoft.Json.JsonReaderException: The reader

【Azure Durable Function】PowerShell Activity 函数遇见 Newtonsoft.Json.JsonReaderException: The reader

时间:2023-11-08 21:11:06浏览次数:29  
标签:Function Newtonsoft JsonReaderException Json Context reader New

问题描述

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

 

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

 

标签:Function,Newtonsoft,JsonReaderException,Json,Context,reader,New
From: https://www.cnblogs.com/lulight/p/17818283.html

相关文章

  • C++笔记 -- 使用STL的function实现回调机制(回调函数)
    1.使用普通函数示例一 代码:#include<iostream>#include<functional>//定义一个回调函数类型usingCallback=std::function<void(int)>;//定义一个函数,用于演示回调函数的使用voidperformOperation(intdata,Callbackcallback){//执......
  • Design of A Basic Computer Model With Stack Function
    IntroductionLastweekendIundertookaprojecttodesignabasiccomputermodelfromclockgeneratordesigntomicroinstructionencoding.AndIpreferablychosetodesignabasicmodelwithcommonstackfunctions.MyReportContributorsZhihao......
  • C++中的高阶函数 -- std::function实现回调
    C++中的高阶函数:以std::function优雅地实现回调1.简介1.1C++高阶函数的概念在函数式编程语言中,高阶函数(Higher-orderFunction)是一个常见的概念,它通常被定义为满足下列条件之一的函数: 接受一个或多个函数作为输入(参数)输出(返回值)是一个函数C++作为一门多范式编程语言,也......
  • 【Azure Function App】解决Function App For Container 遇见ServiceUnavailable的异
    问题描述在使用Terraform创建FunctionApp后,部署函数时候遇见 ServiceUnavailable(BadRequest-- Encounteredanerror(ServiceUnavailable)fromhostruntime.)问题。查看FunctionApp的高级工具(Kudu)站点和默认站点,均出现ApplicationError页面。 问题解答查看Function......
  • 【Azure Function App】解决Function App For Container 遇见ServiceUnavailable的异
    问题描述在使用Terraform创建FunctionApp后,部署函数时候遇见 ServiceUnavailable(BadRequest-- Encounteredanerror(ServiceUnavailable)fromhostruntime.)问题。查看FunctionApp的高级工具(Kudu)站点和默认站点,均出现ApplicationError页面。 问题解答查看F......
  • Redis Functions 介绍之一
    Redis提供了编程接口(programminginterface)可以让你在Redis服务器端执行客户的脚本。一个重大的变化就是从Redis7开始,你可以选择使用RedisFunctions去管理和运行你的脚本,而在此之前你只能使用EVAL命令执行Lua脚本。通过EVAL命令执行的脚本是有缺陷的。如果在Redis服务器端执行......
  • Newtonsoft.Json基本用法
    序列化和反序列化JSONJsonConvert对于想要与JSON字符串相互转换的简单场景,JsonConvert上的SerializeObject ()和 DeserializeObject () 方法在JsonSerializer上提供了易于使用的包装器。下面代码使用序列化与反序列化:1classProduct2{3[JsonIgnore]4......
  • Redis Functions 介绍之一
    Redis提供了编程接口(programminginterface)可以让你在Redis服务器端执行客户的脚本。一个重大的变化就是从Redis7开始,你可以选择使用RedisFunctions去管理和运行你的脚本,而在此之前你只能使用EVAL命令执行Lua脚本。通过EVAL命令执行的脚本是有缺陷的。如果在Redis服务器端执......
  • 关于topology generated by functions的一些思考
      平时所学的拓扑都是直接给出开集族或者是basisorsubbasis,然后由basisorsubbasis生成拓扑。  前些天看Kechris时,遇到了weaktopology。泛函分析时学过weakconvergence,但没有接触过weaktopology。  它给出的定义是generatedbyfunctions………看到的时候就很纳闷到......
  • 如何判断一个function是否是函数式组件?
    要判断一个函数是否是函数式组件,您可以考虑以下几个标准:纯函数性质:函数式组件应该是一个纯函数,即对于相同的输入,始终返回相同的输出,而且没有副作用。它不应该修改任何外部状态或改变传入的参数。如果函数修改了全局变量、文件、数据库或其他外部资源,那它就不是纯函数。不可变性:函数......