Функция возвращает переменную на веб-страницу, переменная куда-то сбрасывается - PullRequest
0 голосов
/ 28 февраля 2020

У нас есть система CMS с перенаправлением URL. Например, когда кто-то переходит на наш root https://ourwebsite/, он будет переведен на https://ourwebsite/CMS?Id=62. Затем эта страница проверяет базу данных на html и выводит это html на страницу.

Часть CMS находится в другом проекте, и наш основной веб-сайт имеет ссылку на этот проект. Он отлично работает в 95% случаев, но вдруг тот же самый вызов для получения страницы, например, с идентификатором 62, работает в течение полдня, но тогда тот же самый вызов для получения 62 завершится неудачно. И с этого момента он, следовательно, потерпит неудачу, пока мы не перезапустим пул приложений.

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

Странно то, что у нас есть вызов со страницы в наш репозиторий, var CMSPage = _repository.GetCMSPageById (62) и непосредственно перед последним возвратом, прежде чем мы go вернемся на страницу, у нас есть требуемый объект в переменной. (логирование показало это) Но после возврата на страницу объект внезапно становится нулевым. Кажется, что он сбрасывает его где-то между последним возвратом из нашего хранилища (в другом dll / проекте) и страницей.

Следовательно, это ВСЕГДА происходит после неактивного периода нашего веб-сервера, в основном 20-30 минут. Таким образом, мы предполагаем, что веб-сервер перезагружает свою память, а затем звонки перестают работать.

Пример: вчера вечером веб-сайт работал нормально, последний вызов страницы CMS был 01:58:30. Тогда никто не посещал сайт до 02:24:00. Следующий вызов объекта, который он мог вернуть в 01:58, неожиданно завершился неудачей. При дальнейшем исследовании мы увидели, что веб-сервер вызвал функцию onmodelCreating EF в 02:23:10. Стечение обстоятельств? Скорее всего, нет ... Предположительно, веб-сервер переработал что-то или произвел сборку мусора из-за более длительного периода бездействия. И тогда он начинает терпеть неудачу. Странно то, что после сбоя он продолжает сбой при каждом требовании CMS, пока не произойдет перезапуск пула приложений, а затем все снова будет работать.

Мы не знаем, с чего начать поиск, поскольку это не какой-либо код, который не удается, у него есть объект прямо перед возвратом к вызывающей функции, а затем он внезапно исчезает ... У кого-нибудь есть идеи?

Пример кода:

В загрузке страницы страницы, которая обработает запрос страницы cms, есть этот фрагмент кода:

Debug.Log($"DustedPreview PageLoad - Get Version By pageversionId: {pageVersionId}");
                    //PageVersion = _domainLogic.GetPageVersionById(pageVersionId);
                    PageVersion = _pageVersionCache.GetPageVersionById(pageVersionId);
                    Debug.Log($"DustedPreview PageLoad - Return PageVersion:(Id:{PageVersion.Id}){PageVersion?.Name ?? "!!ERROR !! PageVersion is NULL"}");

Я реализовал кэширование, но проблема уже была, и точно такая же, прежде чем вообще было кэширование. Теперь вызывается PageVersionCaching, более конкретно c эта функция

public ICMSPageVersion GetPageVersionById(int Id)
    {
        return _pageVersionCache.GetOrCreate(Id, () => _domainLogic.GetPageVersionById(Id));
    }

GetOrCreate просто возвращает объект из кэша, если он существует, или создает новый, если его нет. Поскольку проблема уже существовала до того, как было выполнено кэширование, и проблема возникает только тогда, когда ему нужно повторно извлечь элемент из базы данных, я подробно опишу только go для части извлечения. Так что мой DomainLogi c имеет следующий код для извлечения: (вплоть до возврата туда, который возвращает на страницу, у меня есть полный объект, как я хочу)

public ICMSPageVersion GetPageVersionById(int Id)
        {
            var pv = _cmsRepository.GetPageVersionById(Id);
            var dcPv = pv.CreateDcControlledInstance();
            Debug.Log($"CMSDomainLogic - Return PageVersion:(Id:{dcPv.Id}){dcPv?.Name ?? "!!ERROR !! PageVersion is NULL"}");
            return dcPv;
        }

Хранилище в свою очередь имеет эта функция:

public ICMSPageVersion GetPageVersionById(int Id)
        {
            var proxyCreationEnabled = _ctx.Configuration.ProxyCreationEnabled;
            _ctx.Configuration.ProxyCreationEnabled = false;
            var pv = _ctx.CMSPageVersions
                    .Include(x => x.CMSPage)
                    .Include(x => x.CMSPreviewPage)
                    .Include(x => x.CreatedBy)
                    .Include(x => x.ModifiedBy)
                    .Include(x => x.Contents)
                    .Include("CMSPage.CmsTemplate")
                    .Include("CMSPage.CmsTemplate.TemplatePlaceHolders")
                    .Include(x => x.Language)
                    .Include(x => x.State)
                    .SingleOrDefault(q => q.Id == Id);
            _ctx.Configuration.ProxyCreationEnabled = proxyCreationEnabled;
            var dlPv = FromDto(pv, _cmsFactory.CreatePageVersion());

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