WebApi Ninject与InRequestScope一起使用OPTIONS调用

时间:2015-06-18 09:13:08

标签: entity-framework asp.net-web-api ninject ninject.web

我已经设置了我的webApi应用程序,以便使用RequestScope注入实体框架DBContent。每个存储库都将DbContext作为构造函数参数,使用Ninject注入。

但是我似乎对预先发出的请求(OPTIONS调用)有问题。

当收到OPTIONS调用时,会创建相应的存储库并为每个请求使用一个DbContext,当请求返回时(200),它会按预期进行操作。

然后进行相关的GET调用。

我所看到的是没有为这些调用创建新的DbContext。存储库尝试访问在OPTIONS调用结束时放置的Context。

这是预期的吗? 我在配置中遗漏了什么吗?

这是一些跟踪输出

  

您可以看到在GET请求后首次尝试使用数据库   作为ID为39bb041e-6098-4606-a4c0-aa5db2e8c6ed的DbContext失败   已在之前的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:\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" />

2 个答案:

答案 0 :(得分:1)

我有一段时间遇到同样的问题。

尝试以这种方式使用它。

kernel.Bind<DbContext>().ToSelf().InScope(c => c.Request);

答案 1 :(得分:0)

解决方案非常简单,在我睡觉前思考这个问题时我猜对了。我之前已将存储库的生命周期更改为单例以测试另一个问题。

因此,虽然上下文具有每个请求的范围,但是使用它的存储库却没有。由于具有单例范围,它们从未被处理掉,因此在下一个请求中,试图访问不再存在的上下文。

道德:尽量不要多任务,特别是在一整天的工作之后不要迟到。