当前位置: 首页 > 编程语言 > C#

Owin.AppBuilderExtensions中的内存泄漏分享

时间:2023-04-11 11:17:20 C#

Owin.AppBuilderExtensions中的内存泄漏我在Web应用程序中使用OWIN+Microsoft.AspNet.Identity.Owin(v.2.0.0.0)。我按照广泛推荐的方式为每个Web请求注册UserManager/DbContext:app.CreatePerOwinContext(ApplicationDbContext.Create);app.CreatePerOwinContext(ApplicationUserManager.Create);但都没有得到处理。我瞥了一眼反射器,它看起来像是扩展方法中的一个错误:抛出新的ArgumentNullException("app");}if(createCallback==null){thrownewArgumentNullException("createCallback");}对象[]args=新对象[1];IdentityFactoryOptions选项=newIdentityFactoryOptions{DataProtectionProvider=app.GetDataProtectionProvider()};IdentityFactoryProviderprovider=newIdentityFactoryProvider{OnCreate=createCallback};options.Provider=供应商;args[0]=选项;app.Use(typeof(IdentityFactoryMiddleware),args);IdentityFactoryProvider有两个回调-create和dispose,但是这里没有注册dispose回调。我也证实了我对内存检测器的怀疑。我在codeplex/github上没有看到Owin(实际上我认为它是开源的),所以我不知道去哪里问我的问题:其他人可以确认这是内存泄漏吗?我不确定,因为谷歌没有说,我希望它应该在任何地方讨论,如果这是一个错误。我也有他的问题,在CreatePerOwinContext注册的任何东西都没有被处理。我正在使用v2.1。这是一个临时修复程序,在修复此库之前对我来说效果很好。您基本上必须在以下类中使用RegisterwithCreatePerOwnContext手动注册每种类型,然后在启动过程结束时注册此自定义类:公共OwinContextDisposal(IOwinContextowinContext){如果(HttpContext.Current==null)返回;//TODO:在此处添加所有owin上下文一次性类型_disposables.Add(owinContext.Get());_disposables.Add(owinContext.Get());HttpContext.Current.DisposeOnPipelineCompleted(这个);}publicvoidDispose(){foreach(vardisposablein_disposables){disposable.Dispose();最后,您的启动过程会注册此类:app.CreatePerOwinContext((o,c)=>newOwinContextDisposal(c));现在一切都将在请求管道的末尾妥善处理。AppBuilderExtensions类中的内存泄漏已在最新版本的Microsoft.AspNet.Identity.Owin库(2.2.1)中得到修复。我用Reflector检查了代码,并在AppBuilderExtensions.CreatePerOwinContext()创建的对象的Dispose()方法中放置了断点。您可以将使用CreatePeOwinContext()创建的实例的逻辑放在用于创建它的同一回调中。即:publicclassStartup{publicvoidConfiguration(IAppBuilderapp){app.CreatePerOwinContext(ClassIWantOneInstancePerContext.Create);//othercode...}}然后你应该只关心包括对DisposeOnPipelineCompleted()的调用。即:publicclassClassIWantOneInstancePerContext{//其他代码...publicstaticClassIWantOneInstancePerContextCreate(){ClassIWantOneInstancePerContextTheInstance=newClassIWantOneInstancePerContext();HttpContext.Current.DisposeOnPipelineCompleted(TheInstance);返回实例;包含Dispose()方法!用法:app.CreatePerRequest();扩展方法:publicstaticIAppBuilderCreatePerRequest(thisIAppBuilderbuilder)whereT:IDisposable{builder.Use(async(context,next)=>{varresolver=context.Get();using(varinstance=(T)resolver.GetService(typeof(T))){context.Set(instance);if(next!=null){awaitnext();}}});返回生成器;要使用依赖注入,你必须配置app.UseScopePerOwinRequest(_dependencyResolver);:app.UseScopePerOwinRequest(_dependencyResolver);-这应该是第一个中间件..publicstaticIAppBuilderUseScopePerOwinRequest(thisIAppBuilderbuilder,IDependencyResolverresolver){builder.Use(async(context,next)=>{使用(varinstance=resolver.BeginScope()){context.Set(instance);如果(下一个!=null){等待下一个();}}});返回生成器;}要使上面的代码生效,必须使用任何容器来实现IDepedencyResolver以上就是C#学习教程:Owin.AppBuilderExtensions中的内存泄漏的全部内容。代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:

最新推荐
猜你喜欢