【问题标题】:How can I increase the JSON deserialization MaxDepth limit in my ASP.NET Core webapp如何在我的 ASP.NET Core webapp 中增加 JSON 反序列化 MaxDepth 限制
【发布时间】:2019-09-27 16:17:17
【问题描述】:

我们将 ASP.NET Core 2.1 与 .NET Framework 4.6.2 结合使用。

我们有一个客户需要向我们的 webapp 发送一个相当嵌套的 json 结构。

当他们进行此调用时,我们将输出以下日志并返回错误:

阅读器的 MaxDepth 已超过 32。路径 'super.long.path.to property',第 1 行,位置 42111。"

我查看了 ASP.NET Core 代码库,并观察到在框架提供的反序列化程序中对 MaxDepth = 32 的几个引用。

是否可以将其配置为不同的深度?

【问题讨论】:

    标签: c# asp.net-core json.net asp.net-core-2.1


    【解决方案1】:

    我没有对此进行测试,但在 Startup.cs 中你应该可以执行以下操作:

    services.AddMvc().AddJsonOptions(options => {
        options.SerializerSettings.MaxDepth = 64;  // or however deep you need
    });
    

    【讨论】:

    • 就这么简单。值得强调的是,如果您更改此设置,则会对您的应用程序产生其他影响 - 如果您在其他地方使用不同的序列化程序进行序列化(或有其他可能发生反序列化的入口点),您还需要对中的设置进行此更改那些序列化程序
    • 只能对一个班级进行此设置。我只想限制某个类的深度。
    • 对我来说,我添加了这段代码并且它有效。 services.AddMvc().AddNewtonsoftJson(options => { options.SerializerSettings.MaxDepth = 64; // 或者你需要的深度 });
    • 当使用AddControllers(),然后services.AddControllers().AddJsonOptions(options => options.JsonSerializerOptions.MaxDepth = 64):
    【解决方案2】:

    您还可以直接在反序列化中设置所需的深度,如下例所示:

    JsonConvert.DeserializeObject< T >(json, new JsonSerializerSettings
    {
        MaxDepth = //the value you need
    });
    

    【讨论】:

      【解决方案3】:

      如果您使用的是 .NET Core 3.1,请在您的 startup.cs 文件中尝试此操作。确保安装 Newtonsoft.Json 包。

      services.AddMvc().AddNewtonsoftJson(options =>
      {
          options.SerializerSettings.MaxDepth = 64;
      });
      

      【讨论】:

        【解决方案4】:

        对于带有System.Text.Json 的 .NET Core 5.0:

        services.AddMvc().AddJsonOptions(options => 
        {
            options.JsonSerializerOptions.MaxDepth = 64;
        });
        

        【讨论】:

          猜你喜欢
          • 2015-06-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-12-26
          相关资源
          最近更新 更多