【问题标题】:Does ASP.NET Identity's UserManager need to be closed or disposed?ASP.NET Identity 的 UserManager 是否需要关闭或处置?
【发布时间】:2018-08-02 23:42:55
【问题描述】:

我使用 ASP.NET Identity 已经有一段时间了,我一直在关注教程和网站,这些教程和网站总是说要使用以下代码在我的方法中创建 UserManager:

var userManager = Context.GetOwinContext().GetUserManager<ApplicationUserManager>()

一切正常,直到有一天,我注意到 UserManager 实现了 IDisposable。为了确保我打开的所有东西都能正常关闭,我在所有这些实例中添加了using,突然一切都停止了工作。我开始收到“无法访问已处置的对象”。到处都是错误。根据我的研究,显然有些实例已被关闭,而其他实例仍在使用中。

奇怪的是,当我在网上搜索时,几乎没有关于是否应该关闭或处置 UserManager 或任何其他 Manager(即 SignInManager、RoleManager)的信息。

那么,对此有何共识?这些经理是否应该被关闭/处置?如果不是,那么如果不在方法中,我们应该在哪里声明它们?我读过它们不应该是静态的。

【问题讨论】:

  • 上面的代码很可能返回一个可重用的实例。如果你处理掉它,那么你就破坏了该方法的实现。
  • 好吧,我认为我必须在每个方法上都实例化它,所以我使用了“使用”,只有在我完成代码后才关闭它。当同样使用 UserManager 的父母版页突然没有一个父母版页时发生错误,因为“使用”关闭了其子页中的所有实例。但是阅读下面的内容,我想我找到了答案。
  • 您不是在“实例化” - 您正在使用现有实例(或延迟加载的实例)。仅当您使用 new 关键字时才会发生实例化。
  • 知道了。谢谢!

标签: c# asp.net asp.net-identity


【解决方案1】:

我可能已经找到了答案。在我不断挖掘晦涩的链接之后,我发现了这篇 MSDN 博客文章,它解释了这些管理器应该是单实例的,并准确地解释了如何在页面或控制器中声明它们: https://blogs.msdn.microsoft.com/webdev/2014/02/12/per-request-lifetime-management-for-usermanager-class-in-asp-net-identity/

【讨论】:

    猜你喜欢
    • 2021-12-08
    • 2010-10-19
    • 1970-01-01
    • 1970-01-01
    • 2016-08-06
    • 2019-07-21
    • 2015-06-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多