簡體   English   中英

如何在C#asp.net MVC中擴展RecursionLimit的限制

[英]how to extend the limit of RecursionLimit in C# asp.net MVC

在ASP.NET MVC中,當我嘗試通過JSON將數據發送到瀏覽器時,我得到了異常RecursionLimit。

無論JSON有多大,我怎么能讓它發揮作用。

RecursionLimit屬性的默認值為100,這意味着它可以序列化嵌套到相互引用的100個對象的深度的對象。

我無法想象您實際上有嵌套深度的對象,因此錯誤消息的最可能原因是您有一個對象包含對自身的引用,或者兩個對象相互引用。 由於這會導致無限的子對象鏈,因此您將獲得序列化程序中堆棧溢出的等效值。

使用視圖模型來中斷遞歸。 您不能JSON序列化遞歸引用自身的對象。 Ayende Rahien有一系列關於這個問題的精彩博文

您可以在忽略這些屬性時JSON序列化遞歸引用自身的對象。 我的用戶類有一個也是用戶對象的屬性,但我忽略該屬性:

    Users oSuperior;
    [ScriptIgnore(), XmlIgnore()]
    public Users Superior
    {
        get
        {

            if (oSuperior == null)
            {
                oSuperior = new Users();

                if (iIDUserSuperior > 0)
                    oSuperior.Load(iIDUserSuperior);
            }
            return oSuperior;
        }
    }

似乎Microsoft已經為JsonResult類添加了一些有用的屬性,以增加.NET Framework 4.5中的遞歸限制和最大JSON長度:

public ActionResult GetJson()
{
    var result = Json(obj);
    result.RecursionLimit = 1024;
    result.MaxJsonLength = 8388608;
    return result;
}

因此,現在您可以通過設置這些屬性輕松設置您希望允許JSON對象的“大”。

由於以下配置在ASP.NET MVC中似乎無用:

<system.web.extensions>
  <scripting>
    <webServices>
      <jsonSerialization recursionLimit="1024"/>
    </webServices>
  </scripting>
</system.web.extensions>

我最終使用以下一個班輪來解決我的問題:

new System.Web.Script.Serialization.JavaScriptSerializer(){RecursionLimit = 1024}.Serialize(@Model)

而不是使用默認遞歸限制為100的MVC序列化方法:

Json.Encode(@Model)

它可能不是最好的解決方案,但如果您需要快速修復,它確實很簡單。

除了前面提到的方法,您可以使用Json.NET提供的默認JSON序列替換默認的JSON序列, 默認情況下似乎沒有明確的限制

空值表示沒有最大值。 默認值為null。

例如:

JsonConvert.SerializeObject(theObject);

注意: ASP.NET Web API 默認使用此JSON序列化程序

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM