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

Posted

技术标签:

【中文标题】更新 Microsoft.AspNet.Identity.Owin 2.2.0 后启动时处理 Ninject 内核【英文标题】:Ninject Kernel being disposed on startup after updating Microsoft.AspNet.Identity.Owin 2.2.0 【发布时间】:2015-06-03 17:52:52 【问题描述】:

我正在开发一个使用 MVC5 和 WebApi 2 和 Owin 的 WebApplication。我最近将 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?

【问题讨论】:

我看到了同样的事情:( 我从2.2.0出来就一直有这个问题,2.2.1没有解决。 我们遇到了同样的问题。不幸的是,我们无法找到解决方案。解决方法是将 Microsoft.AspNet.Identity.Owin 包降级到版本 2.1.0 【参考方案1】:

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

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

为了解决将 CreatePerOwinContext 与 Ninject StandardKernel 一起使用时的问题,我尝试使用以下代码:

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

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

【讨论】:

来自 Hao:我认为应该没问题,只要 ninject 以某种方式处理每个请求对象【参考方案2】:

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

【讨论】:

以上是关于更新 Microsoft.AspNet.Identity.Owin 2.2.0 后启动时处理 Ninject 内核的主要内容,如果未能解决你的问题,请参考以下文章

ABP规则怎么自动更新

更新父状态时更新子组件

在哪看到手机历史更新日志

更新查询更新所有记录 - 只希望选择记录更新

Thinkphp怎么批量更新数据

win10更新失败怎么办?