Я реализовал пользовательское промежуточное ПО ASP.NET Core, которое использует контекст базы данных в качестве зависимости.Иногда он генерирует следующее исключение для самого первого запроса, поступающего в API:
Произошло необработанное исключение при выполнении запроса.System.InvalidOperationException: была сделана попытка использовать контекст во время его настройки.Экземпляр DbContext нельзя использовать внутри OnConfiguring, поскольку он все еще настраивается на этом этапе.Это может произойти, если вторая операция запускается в этом контексте до завершения предыдущей операции.Ни один из членов экземпляра не гарантированно является потокобезопасным.
Я мог воспроизвести его только при вызове API из SPA.Когда я позвонил API из Swagger, все работало просто отлично.Изменение порядка промежуточного программного обеспечения не помогло.После осмотра я понял, что промежуточное программное обеспечение создается один раз для каждого приложения, в то время как контекст базы данных имеет ограниченный срок службы.Так что, возможно, проблема заключалась в том, чтобы вставить контекст моей базы данных прямо в конструктор промежуточного программного обеспечения.Я исправил свой код, удалив внедрение контекста базы данных из конструктора и вставив его непосредственно в метод InvokeAsync
.Это помогло, и исключение пропало.
Хотя я решил свою проблему, я пока не совсем понимаю, как она вообще работает.Насколько я понимаю, контекст базы данных EF.Core по умолчанию регистрируется с ограниченным временем жизни, что в терминах приложения ASP.NET Core означает, что новый контекст создается для каждого нового запроса и удаляется после его завершения.Поскольку я ввел контекст базы данных в конструктор промежуточного программного обеспечения, он должен был быть удален сразу после завершения первого запроса, и это исключение или другой, говорящий о том, что он пытается использовать уже удаленный контекст, должно быть выброшено.Также мне совершенно непонятно, почему эта ошибка возникала только тогда, когда API вызывался из SPA, пока он работал хорошо для всех запросов Swagger.