更新 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 内核的主要内容,如果未能解决你的问题,请参考以下文章