как расширить предел RecursionLimit в C # asp.net MVC - PullRequest
5 голосов
/ 09 мая 2011

в ASP.NET MVC я получил исключение, превышающее RecursionLimit, когда я пытаюсь отправить данные в браузер через JSON.

как я могу заставить его работать независимо от того, насколько велик JSON.

Ответы [ 6 ]

10 голосов
/ 09 мая 2011

Значение по умолчанию для свойства RecursionLimit равно 100, что означает, что оно может сериализовать объекты, вложенные на глубину до 100 объектов, ссылающихся друг на друга.

Я не могу себе представить, что у вас на самом деле есть объекты, которые вложены так глубоко, поэтому наиболее вероятной причиной сообщения об ошибке является то, что у вас есть объект, который содержит ссылку на себя, или два объекта, которые имеют ссылки друг на друга , Поскольку это вызывает бесконечную цепочку дочерних объектов, вы получаете эквивалент переполнения стека в сериализаторе.

4 голосов
/ 09 мая 2011

Использование моделей просмотра, чтобы прервать рекурсию. Вы не можете JSON сериализовать объекты, которые рекурсивно ссылаются на себя. У Ayende Rahien есть замечательная серия сообщений в блоге об этой проблеме.

1 голос
/ 27 мая 2015

Похоже, что Microsoft добавила некоторые полезные свойства в класс JsonResult для увеличения предела рекурсии и максимальной длины JSON в .NET framework 4.5 :

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

Следовательно, теперь вы можете легко установить, насколько «большим» вы хотите, чтобы ваши объекты JSON были, установив эти свойства.

1 голос
/ 28 сентября 2012

Вы можете JSON-сериализовать объекты, которые рекурсивно ссылаются на себя, когда вы игнорируете эти свойства.Мой класс пользователей имеет свойство, которое также является объектом пользователя, но я игнорирую это свойство:

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

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

                if (iIDUserSuperior > 0)
                    oSuperior.Load(iIDUserSuperior);
            }
            return oSuperior;
        }
    }
0 голосов
/ 13 марта 2018

Помимо вышеупомянутых методов, вы можете заменить сериализацию JSON по умолчанию на сериализацию, предоставляемую Json.NET, для которой по умолчанию не имеет явного ограничения :

Нульзначение означает, что нет максимума.Значение по умолчанию: null.

Например:

JsonConvert.SerializeObject(theObject);

ПРИМЕЧАНИЕ. Веб-API ASP.NET по умолчанию использует этот сериализатор JSON .

0 голосов
/ 10 октября 2014

Поскольку следующая конфигурация в 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)

Вместо использования метода сериализации MVC, который имеет предельное значение рекурсии по умолчанию 100:

Json.Encode(@Model)

Возможно, это не лучшее решение, но его легко использовать, если вам нужно быстрое решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...