System.InvalidOperationException: была сделана попытка использовать контекст во время его настройки - PullRequest
0 голосов
/ 22 февраля 2019

Я реализовал пользовательское промежуточное ПО ASP.NET Core, которое использует контекст базы данных в качестве зависимости.Иногда он генерирует следующее исключение для самого первого запроса, поступающего в API:

Произошло необработанное исключение при выполнении запроса.System.InvalidOperationException: была сделана попытка использовать контекст во время его настройки.Экземпляр DbContext нельзя использовать внутри OnConfiguring, поскольку он все еще настраивается на этом этапе.Это может произойти, если вторая операция запускается в этом контексте до завершения предыдущей операции.Ни один из членов экземпляра не гарантированно является потокобезопасным.

Я мог воспроизвести его только при вызове API из SPA.Когда я позвонил API из Swagger, все работало просто отлично.Изменение порядка промежуточного программного обеспечения не помогло.После осмотра я понял, что промежуточное программное обеспечение создается один раз для каждого приложения, в то время как контекст базы данных имеет ограниченный срок службы.Так что, возможно, проблема заключалась в том, чтобы вставить контекст моей базы данных прямо в конструктор промежуточного программного обеспечения.Я исправил свой код, удалив внедрение контекста базы данных из конструктора и вставив его непосредственно в метод InvokeAsync.Это помогло, и исключение пропало.

Хотя я решил свою проблему, я пока не совсем понимаю, как она вообще работает.Насколько я понимаю, контекст базы данных EF.Core по умолчанию регистрируется с ограниченным временем жизни, что в терминах приложения ASP.NET Core означает, что новый контекст создается для каждого нового запроса и удаляется после его завершения.Поскольку я ввел контекст базы данных в конструктор промежуточного программного обеспечения, он должен был быть удален сразу после завершения первого запроса, и это исключение или другой, говорящий о том, что он пытается использовать уже удаленный контекст, должно быть выброшено.Также мне совершенно непонятно, почему эта ошибка возникала только тогда, когда API вызывался из SPA, пока он работал хорошо для всех запросов Swagger.

1 Ответ

0 голосов
/ 26 февраля 2019

Кажется, я понял это.Я не упомянул, что в своем приложении я использую поставщика услуг Autofac вместо поставщика услуг по умолчанию, что на самом деле стоило упомянуть.Согласно документации ASP.NET Core

Поставщик услуг по умолчанию в среде разработки выполняет проверки для проверки того, что:

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

Очевидно, что поставщик услуг Autofac не выполняет такие проверки, поэтомуэто позволяет внедрять сервисы с ограниченной областью от корневого поставщика услуг.А согласно документации

Время жизни корневого поставщика услуг соответствует времени жизни приложения / сервера, когда поставщик запускается с приложением, и удаляется, когда приложение закрывается.

Вот почему мое приложение работало должным образом, хотя я внедрил сервис с областью действия в синглтон.Он использовал экземпляр DbContext, полученный от корневого поставщика услуг, и иногда я мог получить такую ​​ситуацию, когда попытался выполнить запрос к базе данных до того, как контекст был фактически инициализирован.Это объясняет спорадический характер этой проблемы.

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