更新Microsoft.AspNet.Identity.Owin 2.2.0后,Ninject内核在启动时处理

时间:2015-03-30 16:01:57

标签: ninject owin asp.net-mvc-5.2

我正在开发一个WebApplication,它使用MVC5和WebApi 2和Owin。我最近将Microsoft Asp.Net NuGet软件包(Microsoft.AspNet.Mvc等)从5.2.2更新到5.2.3,将Owin NuGet软件包(Microsoft.Owin等)从3.0.0更新到3.0.1 。我还将Microsoft.AspNet.Identity.Owin从版本2.1.0更新到版本2.2.0

然后我将相应的Ninject WebApi软件包(Ninject.Web.WebApi等)从3.2.3更新到版本3.2.4,以便进行编译,但没有更新Ninject.Web.Common.OwinHost,因为这是最新版本(3.2.3)。

当我尝试运行该应用程序时,出现以下错误:

加载Ninject组件ICache时出错 没有这样的组件在内核的组件容器中注册。

建议:

1)如果您已为KernelBase创建了自定义子类,请确保已正确实现AddComponents()方法。

2)确保您没有通过调用RemoveAll()从容器中删除组件。

3)确保您没有意外创建多个内核。

我在OwinStartup类中创建的内核是从Owin.AppBuilderExtensions.CreateOwinContext()方法处理的,它是间接来自OwinBootstrapper.Execute()。

自从将Asp.Net NuGet包更新到5.2.3以来,这种情况才刚刚开始。在更新软件包之前,仍然会调用OwinBootstrapper.Execute(),但不会调用Owin.AppBuilderExtensions.CreateOwinContext()或KernelBase.Dispose()。

我没有更改OwinStartup中的任何代码,我的Ninject内核仍在使用:

创建
    public virtual void Configuration(IAppBuilder app)
    {
        app.UseNinjectMiddleware(CreateKernel);
        app.CreatePerOwinContext(CreateKernel);
    }

我尝试一次更新一个NuGet包,导致问题的具体更新是Microsoft.AspNet.Identity.Owin到2.2.0 Ninject和AspNet.Identity.Owin 2.2是否存在任何已知的兼容性问题0.0

2 个答案:

答案 0 :(得分:0)

通过查看以前的源代码和当前源代码,看起来他们期待一个IDisposable对象并在其生命周期结束时立即调用它(也就是请求)。

我还注意到他们在安装OWIN时提供的其他CreatePerOwinContext例如app.CreatePerOwinContext(ApplicationDbContext.Create);从未处理过(在2.1.0中)?这似乎是一个很大的内存泄漏,因为每次有请求时它们都会实例化一些类。

要在使用Ninject StandardKernel使用CreatePerOwinContext时解决此问题,我尝试使用以下代码:

app.CreatePerOwinContext(
    (Microsoft.AspNet.Identity.Owin.IdentityFactoryOptions<IKernel> options, IOwinContext context) => kernel, 
    (Microsoft.AspNet.Identity.Owin.IdentityFactoryOptions<IKernel> options, IKernel instance) => {}
);

基本上,我在dispose回调中什么都不做。 我不知道这是否会导致内存泄漏,但它肯定会让应用程序再次运行。

答案 1 :(得分:0)

这来自郝:我认为应该没问题,只要ninject负责以某种方式处理每个请求对象