1

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

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

当接收到 OPTIONS 调用时,将创建适当的存储库并为每个请求使用一个 DbContext,当请求返回 (200) 时将按预期处理。

然后进行相关的 GET 调用。

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

这是预期的吗??我的配置中是否缺少某些内容?

这是一些跟踪输出

您可以看到在 GET 请求后第一次尝试使用 DB 失败,因为 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;
    }

NinjectWeb 常见:

    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" />
4

2 回答 2

1

不久前我遇到了同样的问题。

尝试以这种方式使用它。

kernel.Bind<DbContext>().ToSelf().InScope(c => c.Request);
于 2015-06-29T19:42:21.070 回答
0

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

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

道德:尽量不要一心多用,特别是不要在工作了一整天后的深夜。

于 2015-06-19T06:38:25.487 回答