首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Owin.AppBuilderExtensions中的内存泄漏

Owin.AppBuilderExtensions中的内存泄漏
EN

Stack Overflow用户
提问于 2014-06-24 13:22:07
回答 3查看 3.4K关注 0票数 20

我在Web应用程序中使用OWIN + Microsoft.AspNet.Identity.Owin (v.2.0.0.0)。我按照广泛推荐的方式为每个web请求注册UserManager/DbContext:

代码语言:javascript
复制
app.CreatePerOwinContext(ApplicationDbContext.Create);
app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);

但这两个都没有处理过。我看了一眼reflector,它似乎是扩展方法中的一个bug:

代码语言:javascript
复制
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,我希望它应该在任何地方都被讨论。

EN

回答 3

Stack Overflow用户

发布于 2014-07-18 15:32:23

我也有他的问题,在CreatePerOwinContext注册的任何东西都不会被处理。我使用的是v2.1。

这是一个临时的修复,在这个库被修复之前,它对我来说是一个很好的解决办法。基本上,您必须在以下类中手动注册使用register with CreatePerOwnContext的每个类型,然后在启动过程结束时注册此自定义类:

代码语言:javascript
复制
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();
        }
    }
}

在启动过程结束时,注册这个类:

代码语言:javascript
复制
 app.CreatePerOwinContext<OwinContextDisposal>(
      (o, c) => new OwinContextDisposal(c));

现在,所有内容都将在请求流水线的末尾得到正确处理。

票数 6
EN

Stack Overflow用户

发布于 2015-06-19 14:12:44

在最新版本的Microsoft.AspNet.Identity.Owin库(2.2.1)中,已经修复了AppBuilderExtensions类中的内存泄漏。

我已经通过使用反射器和将断点放入由AppBuilderExtensions.CreatePerOwinContext()创建的对象的Dispose()方法来检查代码。

票数 5
EN

Stack Overflow用户

发布于 2014-09-24 19:29:24

您可以将处理使用CreatePeOwinContext()创建的实例的逻辑放在用于创建此实例的同一个回调中。这就是:

代码语言:javascript
复制
public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        app.CreatePerOwinContext<ClassIWantOneInstancePerContext>(ClassIWantOneInstancePerContext.Create);

        //other code...
    }
}

然后,您只需在用于实例化类的回调中包含对DisposeOnPipelineCompleted()的调用即可。这就是:

代码语言:javascript
复制
public class ClassIWantOneInstancePerContext
{
     //other code...

    public static ClassIWantOneInstancePerContext Create()
    {
        ClassIWantOneInstancePerContext TheInstance = new ClassIWantOneInstancePerContext();
        HttpContext.Current.DisposeOnPipelineCompleted(TheInstance);

        return TheInstance;
    }
}

另外,别忘了在类定义中包含Dispose()方法!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24378856

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档