我已经设置了我的webApi应用程序,以便使用RequestScope注入实体框架DBContent.每个存储库都将DbContext作为构造函数参数,该参数使用Ninject注入。
但是,我似乎在预检请求(选项调用)方面遇到了问题。
收到 OPTIONS 调用后,将创建相应的存储库,并为每个请求使用一个 DbContext,当请求返回 (200) 时,将按预期放置该存储库。
然后进行关联的 GET 调用。
我看到的是没有为这些调用创建新的 DbContext。存储库尝试访问在 OPTIONS 调用结束时释放的上下文。
这是意料之中的吗??我的配置中是否缺少某些内容?
下面是一些跟踪输出
您可以看到,在 GET 请求之后第一次尝试使用 DB 作为 ID 为 39bb041e-6098-4606-a4c0-aa5db2e8c6ed 的数据库上下文失败 在之前的 OPTIONS 调用中被处理。
Process request: OPTIONS : http://localhost:52351/api/v1/aroute
Process request: OPTIONS : http://localhost:52351/api/v1/broute
Creating ctx 190d88ba-2781-4ba8-9b90-07d6af937fe9 at 18/06/2015 9:03:51 p.m.
Create ARepository
Creating ctx 39bb041e-6098-4606-a4c0-aa5db2e8c6ed at 18/06/2015 9:03:51 p.m.
Create BRepository
Create CRepository
Process response: OK
Process response: OK
Disposing of 190d88ba-2781-4ba8-9b90-07d6af937fe9 at 18/06/2015 9:03:51 p.m.
Disposing of 39bb041e-6098-4606-a4c0-aa5db2e8c6ed at 18/06/2015 9:03:51 p.m.
Process request: GET : http://localhost:52351/api/v1/aroute
Process request: GET : http://localhost:52351/api/v1/broute
'iisexpress.exe' (CLR v4.0.30319: /LM/W3SVC/1839635423/ROOT-1-130790918249781429): Loaded 'C:WindowsMicrosoft.NetassemblyGAC_MSILSystem.Numericsv4.0_4.0.0.0__b77a5c561934e089System.Numerics.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
AccessDbMethod using 39bb041e-6098-4606-a4c0-aa5db2e8c6ed
A first chance exception of type 'System.InvalidOperationException' occurred in EntityFramework.dll
存储库:
public ARepository(DbContext context)
{
_context = context;
}
NinjectWebCommon:
public static void Start()
{
DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule));
//tried with and without following line
DynamicModuleUtility.RegisterModule(typeof(Ninject.Web.Common.NinjectHttpModule));
DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule));
bootstrapper.Initialize(CreateKernel);
}
private static void RegisterServices(IKernel kernel)
{
//Ensure we only have ONE per request
kernel.Bind<DbContext>().ToSelf().InRequestScope();
}
我安装了以下软件包:
<package id="Microsoft.AspNet.Cors" version="5.2.2" targetFramework="net451" />
<package id="Microsoft.AspNet.Mvc" version="5.2.2" targetFramework="net451" />
<package id="Microsoft.AspNet.Razor" version="3.2.2" targetFramework="net451" />
<package id="Microsoft.AspNet.Web.Optimization" version="1.1.3" targetFramework="net451" />
<package id="Microsoft.AspNet.WebApi" version="5.2.2" targetFramework="net451" />
<package id="Microsoft.AspNet.WebApi.Client" version="5.2.3" targetFramework="net451" />
<package id="Microsoft.AspNet.WebApi.Core" version="5.2.3" targetFramework="net451" />
<package id="Microsoft.AspNet.WebApi.Cors" version="5.2.2" targetFramework="net451" />
<package id="Microsoft.AspNet.WebApi.HelpPage" version="5.2.2" targetFramework="net451" />
<package id="Microsoft.AspNet.WebApi.WebHost" version="5.2.2" targetFramework="net451" />
<package id="Ninject" version="3.2.2.0" targetFramework="net451" />
<package id="Ninject.Web.Common" version="3.2.3.0" targetFramework="net451" />
<package id="Ninject.Web.Common.WebHost" version="3.2.3.0" targetFramework="net451" />
<package id="Ninject.Web.WebApi" version="3.2.4.0" targetFramework="net451" />
<package id="Ninject.Web.WebApi.WebHost" version="3.2.4.0" targetFramework="net451" />
不久前我遇到了同样的问题。
尝试以这种方式使用它。
kernel.Bind<DbContext>().ToSelf().InScope(c => c.Request);
解决方案非常简单,我在睡觉前思考问题时猜到了它。我之前已将存储库的生存期更改为单例以测试另一个问题。
因此,虽然上下文的范围是每个请求,但使用它的存储库没有。 由于具有单例范围,它们从未被释放,因此在下一个请求中,尝试访问不再存在的上下文。
道德:尽量不要一心多用,尤其是工作了一整天后不要在深夜。