我实现了一个自定义的ASP.NET Core中间件,其中使用了数据库上下文作为依赖项。有时,对API的第一个请求抛出以下异常:
执行请求时发生未处理的异常。 System.InvalidOperationException:在配置时尝试使用上下文。由于此时仍在配置中,因此不能在OnConfiguring内部使用DbContext实例。如果在上一个操作完成之前在此上下文中启动了第二个操作,则不保证任何实例成员是线程安全的。
我只能在从SPA调用API时才能重现它。当我从Swagger调用API时,一切都正常工作。更改中间件的顺序并没有帮助。经过挖掘,我意识到middleware只会在应用程序中被实例化一次,而数据库上下文具有范围生存期。因此,问题可能在于直接将数据库上下文注入到middleware的构造函数中。我通过从构造函数中删除对数据库上下文的注入,并将其直接注入到InvokeAsync
方法中来修复了代码。这有所帮助,异常消失了。
虽然我解决了我的问题,但我还不太明白它是如何工作的。据我所知,EF.Core数据库上下文默认情况下注册为范围生存期,在ASP.NET Core应用程序中意味着每个新请求都会实例化一个新的上下文,并在完成后处理。因为我将数据库上下文注入到middleware的构造函数中,所以它应该在第一次请求完成后被处理,而且应该抛出这些异常或另一个异常,说明它正在尝试使用已经处理的上下文。此外,我完全不清楚为什么只有从SPA调用API时才会发生此错误,而对于所有Swagger请求都很好。