c# - Memory leak in Owin.AppBuilderExtensions -
i utilize owin + microsoft.aspnet.identity.owin (v.2.0.0.0) in web application. register usermanager/dbcontext per web request, recommended:
app.createperowincontext(applicationdbcontext.create); app.createperowincontext<applicationusermanager>(applicationusermanager.create);
but neither ever disposed. took glance reflector , seems bug in extension method:
public static iappbuilder createperowincontext<t>(this iappbuilder app, func<identityfactoryoptions<t>, iowincontext, t> createcallback) 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); homecoming app; }
identityfactoryprovider has 2 callbacks - create , dispose, dispose callback not registered here. confirmed suspicion memory profiler.
i don't see owin on codeplex/github (actually thought open source), don't know inquire question: else confirm memory leak? i'm not sure because google says nil it, expect should discussed everywhere, if bug.
i have issue, nil registered createperowincontext gets disposed. i'm using v2.1.
here's temporary prepare working me work around until lib fixed. have manually register each of types utilize register createperowncontext in next class, , @ end of startup procedure register custom class:
public sealed class owincontextdisposal : idisposable { private readonly list<idisposable> _disposables = new list<idisposable>(); public owincontextdisposal(iowincontext owincontext) { if (httpcontext.current == null) return; //todo: add together 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(); } } }
at end startup process register class:
app.createperowincontext<owincontextdisposal>( (o, c) => new owincontextdisposal(c));
now disposed of @ end of request pipeline properly.
c# asp.net-identity owin
No comments:
Post a Comment