C # застрял в цикле StringBuilder - PullRequest
0 голосов
/ 13 октября 2018

У меня есть веб-приложение ASP.NET Core MVC, использующее ядро ​​Entity Framework для взаимодействия с базой данных SQL.Многие страницы частично загружаются с использованием AJAX, но возможны прямые посещения (например, www.example.com/some/actual/page).

Именно здесь возникает проблема.Когда страница посещается напрямую, происходит утечка памяти с StringBuilder.См. Рисунок ниже: StringBuilder memory leak

Дальнейшее расследование, похоже, что есть какой-то рекурсивный цикл, в котором он застревает (Это дерево продолжается, и включается, и включается, и включается...): Recursive Loop

Я только явно использую StringBuilder в одном месте, которое, как я уже определил, не связано с проблемой.Однако, насколько я понимаю, JsonConvert использует базовый StringBuilder.Я использую JsonConvert в основном для преобразования переменной сеанса обратно в объекты, и наоборот.Вот пример:

    public Cycle SelectedCycle
    {
        get
        {
            if (string.IsNullOrEmpty(_httpContextAccessor.HttpContext.Session.GetString(_selectedCycle)))
                return null;

            return JsonConvert.DeserializeObject<Cycle>(_httpContextAccessor.HttpContext.Session.GetString(_selectedCycle));
        }
        set
        {
            var serializedCycle = JsonConvert.SerializeObject(value, Formatting.None, new JsonSerializerSettings() { ReferenceLoopHandling = ReferenceLoopHandling.Ignore });
            _httpContextAccessor.HttpContext.Session.SetString(_selectedCycle, serializedCycle);
        }
    }

Я хочу сказать, что ReferenceLoopHandling = ReferenceLoopHandling.Ignore может быть причиной проблемы, но я не смог подтвердить это.Что может быть причиной этой проблемы и как я могу ее исправить?

Обновление 1:
ReferenceLoopHandling.Ignore, похоже, не является причиной проблемы.

...