WebApi Ninject 与 InRequestScope 与 OPTIONS 调用
WebApi Ninject with InRequestScope with OPTIONS call
我已经设置了我的 webApi 应用程序,以便使用 RequestScope.Each 存储库注入 Entity Framework DBContent,将 DbContext 作为构造函数参数,使用 Ninject 注入。
但是我似乎对预飞行请求(OPTIONS 调用)有问题。
收到 OPTIONS 调用后,将创建适当的存储库,并为每个请求使用一个 DbContext,当请求 returns (200) 时按预期处理。
然后进行关联的 GET 调用。
我看到的是没有为这些调用创建新的 DbContext。存储库尝试访问在 OPTIONS 调用结束时处理的上下文。
这是预料之中的吗??
我的配置中是否遗漏了什么?
这是一些跟踪输出
You can see that the first attempt to use the DB after the GET request
fails as the DbContext with ID 39bb041e-6098-4606-a4c0-aa5db2e8c6ed
was disposed in previous OPTIONS call.
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:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Numerics\v4.0_4.0.0.0__b77a5c561934e089\System.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);
我已经设置了我的 webApi 应用程序,以便使用 RequestScope.Each 存储库注入 Entity Framework DBContent,将 DbContext 作为构造函数参数,使用 Ninject 注入。
但是我似乎对预飞行请求(OPTIONS 调用)有问题。
收到 OPTIONS 调用后,将创建适当的存储库,并为每个请求使用一个 DbContext,当请求 returns (200) 时按预期处理。
然后进行关联的 GET 调用。
我看到的是没有为这些调用创建新的 DbContext。存储库尝试访问在 OPTIONS 调用结束时处理的上下文。
这是预料之中的吗?? 我的配置中是否遗漏了什么?
这是一些跟踪输出
You can see that the first attempt to use the DB after the GET request fails as the DbContext with ID 39bb041e-6098-4606-a4c0-aa5db2e8c6ed was disposed in previous OPTIONS call.
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:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Numerics\v4.0_4.0.0.0__b77a5c561934e089\System.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);