我在Web应用程序中使用OWIN + Microsoft.AspNet.Identity.Owin (v.2.0.0.0)。我按照广泛推荐的方式为每个web请求注册UserManager/DbContext:
app.CreatePerOwinContext(ApplicationDbContext.Create);
app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
但这两个都没有处理过。我看了一眼reflector,它似乎是扩展方法中的一个bug:
public static IAppBuilder CreatePerOwinContext<T>(this IAppBuilder app, Func<IdentityFactoryOptions<T>, IOwinContext, T> createCallback) where T: class, IDisposable
{
if (app == null)
{
throw new ArgumentNullException("app");
}
if (createCallback == null)
{
throw new ArgumentNullException("createCallback");
}
object[] args = new object[1];
IdentityFactoryOptions<T> options = new IdentityFactoryOptions<T> {
DataProtectionProvider = app.GetDataProtectionProvider()
};
IdentityFactoryProvider<T> provider = new IdentityFactoryProvider<T> {
OnCreate = createCallback
};
options.Provider = provider;
args[0] = options;
app.Use(typeof(IdentityFactoryMiddleware<T, IdentityFactoryOptions<T>>), args);
return app;
}
IdentityFactoryProvider有两个回调- create和dispose,但dispose回调没有在这里注册。我也用内存分析器确认了我的怀疑。
我在codeplex/github上没有看到Owin (实际上我以为它是开源的),所以我不知道在哪里问我的问题:其他人能确认这是内存泄漏吗?我不太确定,因为谷歌对此只字不提,如果这是一个bug,我希望它应该在任何地方都被讨论。
发布于 2014-07-18 15:32:23
我也有他的问题,在CreatePerOwinContext注册的任何东西都不会被处理。我使用的是v2.1。
这是一个临时的修复,在这个库被修复之前,它对我来说是一个很好的解决办法。基本上,您必须在以下类中手动注册使用register with CreatePerOwnContext的每个类型,然后在启动过程结束时注册此自定义类:
public sealed class OwinContextDisposal : IDisposable
{
private readonly List<IDisposable> _disposables = new List<IDisposable>();
public OwinContextDisposal(IOwinContext owinContext)
{
if (HttpContext.Current == null) return;
//TODO: Add all owin context disposable types here
_disposables.Add(owinContext.Get<MyObject1>());
_disposables.Add(owinContext.Get<MyObject2>());
HttpContext.Current.DisposeOnPipelineCompleted(this);
}
public void Dispose()
{
foreach (var disposable in _disposables)
{
disposable.Dispose();
}
}
}
在启动过程结束时,注册这个类:
app.CreatePerOwinContext<OwinContextDisposal>(
(o, c) => new OwinContextDisposal(c));
现在,所有内容都将在请求流水线的末尾得到正确处理。
发布于 2015-06-19 14:12:44
在最新版本的Microsoft.AspNet.Identity.Owin
库(2.2.1)中,已经修复了AppBuilderExtensions
类中的内存泄漏。
我已经通过使用反射器和将断点放入由AppBuilderExtensions.CreatePerOwinContext()
创建的对象的Dispose()
方法来检查代码。
发布于 2014-09-24 19:29:24
您可以将处理使用CreatePeOwinContext()
创建的实例的逻辑放在用于创建此实例的同一个回调中。这就是:
public class Startup
{
public void Configuration(IAppBuilder app)
{
app.CreatePerOwinContext<ClassIWantOneInstancePerContext>(ClassIWantOneInstancePerContext.Create);
//other code...
}
}
然后,您只需在用于实例化类的回调中包含对DisposeOnPipelineCompleted()
的调用即可。这就是:
public class ClassIWantOneInstancePerContext
{
//other code...
public static ClassIWantOneInstancePerContext Create()
{
ClassIWantOneInstancePerContext TheInstance = new ClassIWantOneInstancePerContext();
HttpContext.Current.DisposeOnPipelineCompleted(TheInstance);
return TheInstance;
}
}
另外,别忘了在类定义中包含Dispose()
方法!
https://stackoverflow.com/questions/24378856
复制相似问题