ASP. NET Core 2.1 - исключение переполнения стека, связанное с внедрением зависимости - PullRequest
0 голосов
/ 06 января 2020

Я получаю исключение переполнения стека после загрузки 4 или 5 раз простого действия контроллера. Веб-приложение работает на Azure, и мне удалось вывести информацию об исключении, и проблема, похоже, связана с внедрением зависимостей.

    internal object GetService(Type serviceType, ServiceProviderEngineScope serviceProviderEngineScope)
    {
        if (_disposed)
        {
            ThrowHelper.ThrowObjectDisposedException(); --> this is executed
        }

        var realizedService = RealizedServices.GetOrAdd(serviceType, _createServiceAccessor);
        _callback?.OnResolve(serviceType, serviceProviderEngineScope);
        return realizedService.Invoke(serviceProviderEngineScope);
    }

Запуск веб-приложения на моем компьютере не имеет проблем, он только терпит неудачу в PROD.

Вот как я захватил исключение в Azure: https://blogs.msdn.microsoft.com/benjaminperkins/2017/06/28/capture-a-stackoverflowexception-and-make-a-dump-0xc00000fd/

Я открыл дамп в Visual Studio и смог определить строку кода, в которой произошел сбой (описано выше), но я все еще не знаю, как это исправить. Все мои зависимости разрешаются с помощью времени действия "scope".

Любая помощь приветствуется.

1 Ответ

1 голос
/ 07 января 2020

Я наконец исправил это! У меня был класс, у которого было около 20 зависимостей, и у каждой зависимости было больше зависимостей, может быть 4 или 5 уровня. Циркулярных зависимостей не было, потому что это нормально работало в моей среде разработки. После того, как я провела рефакторинг и уменьшила зависимости, все заработало нормально.

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

Это была моя методология, чтобы исправить это:

1) Найдите простейший случай, который потерпел неудачу.

2) Закомментируйте все зависимости и попробуйте снова. Это сработало, хорошо, речь идет о зависимостях.

3) Создайте исключение переполнения стека в рабочей среде, поскольку эта ошибка не возникала в среде dev.

4) Убедитесь, что это проблема внедрения зависимостей и проверьте. NET Исходный код ядра.

5) Уменьшите количество экземпляров и уровней зависимостей.

6) Разверните. Если это не сработает, go до (5). Если это работает, ты снова счастлив:)

...