Обнаружена циклическая ссылка при сериализации с помощью Json.Encode

У меня есть ситуация, когда Json.Encode работает локально (localhost), который представляет собой 64-битное окно iis7 Windows 7.

Если я развертываю 32-битный IIS6 в Windows 2003, я получаю циклические ошибки ссылки. Ниже "Ошибка здесь" показана строка, с которой начинается ошибка.

@*var model = '@Html.Raw(Json.Encode(Model))';*@ <<<<Error here
var model = '@Html.GetJson(Model)';

В рамках попытки решить эту проблему я подумал, что, возможно, одна из dll проекта, которая использовалась на сервере, отличалась от локальной, поэтому я скопировал любую ссылочную dll в каталог bin сервера. Это не помогло.

У меня есть довольно простое исправление. Я бы предпочел идентифицировать проблему. Я предполагаю, что он использует некоторую dll на сервере иначе, чем локально, чтобы вернуть json через Json.Encode затем на сервере.

Мое решение, показанное во второй строке выше, - использовать Json.Net и помощник mvc.

public static MvcHtmlString GetJson(this HtmlHelper htmlHelper, ViewModel vm)
{
    string s = JsonConvert.SerializeObject(vm);
    return new MvcHtmlString(s);
}

Кто-нибудь это видел и решил? (без json.net)


person David    schedule 06.08.2013    source источник
comment
Пожалуйста, проверьте этот ответ: stackoverflow.com/questions/1153385/   -  person ClayKaboom    schedule 13.11.2013


Ответы (1)


Предполагая, что вы используете Entity Framework, взгляд на сущности, разработанные фреймворком, прольет некоторый свет на эту тему. Например, у меня была таблица под названием Sessions и одна под названием Enrollments, причем таблица Enrollments имела отношение FK к таблице сеансов PK. Это привело к тому, что объекты сеанса имели коллекцию Enrollments, а объекты Enrollment имели виртуальный экземпляр сеанса, для которого была заявлена ​​регистрация ... который, в свою очередь, указывал на коллекцию Enrollments и т.д., вы получаете изображение, И почему проблема с круговой ссылкой была обнаружена сериализацией json.

Решение заключалось в том, чтобы НЕ запрашивать коллекцию объектов Session в коде, а вместо этого запрашивать анонимный (нетипизированный) объект со всеми теми же полями в нем. Это предотвращает запутывание Json.Encode (), поскольку он не знает о циклической ссылке, с которой Entity Framework в порядке в коде / коде на стороне сервера.

person IdahoB    schedule 17.05.2018