代码之家  ›  专栏  ›  技术社区  ›  JulianM

ASP.NET Web服务在序列化可释放对象时是否泄漏内存?

  •  0
  • JulianM  · 技术社区  · 15 年前

    在以下两种情况下,如果客户是一次性的(实现IDisposable),我相信ASP.NET不会处理它,这可能是内存泄漏的原因:

        [WebMethod]
        public Customer FetchCustomer(int id)
        {
            return new Customer(id);
        }
    
        [WebMethod]
        public void SaveCustomer(Customer value)
        {
          // save it
        }
    

    此(所谓的)缺陷适用于任何IDisposable对象。例如,从ASP.NET Web服务返回数据集也会导致内存泄漏-数据集不会被释放[编辑: This post 对数据集进行释放的声明不起任何作用,因此这可能不是问题所在]

    在我的例子中,客户打开了一个数据库连接,该连接在Dispose中被清除了,但从未调用Dispose,结果导致了未关闭的数据库连接的加载。我意识到这里有很多不好的做法,但重点是ASP.NET(反序列化程序)负责处理这些对象,为什么不呢?

    这是我一段时间以来一直关注的一个问题,但从来没有触及问题的底部。我希望有人能证实我的发现,也许能解释一下是否有办法处理它。

    2 回复  |  直到 15 年前
        1
  •  3
  •   Aaronaught    15 年前

    这确实是您的设计问题,而不是ASP.NET问题。这个 XmlSerializer 它用于通过SOAP序列化对象,但不知道要序列化的对象,也不知道它们是否实现。 IDisposable . 此外,即使他们 实施 不可分的 ;您可能正在返回单例实例或缓存中的对象。

    Web服务应该接受并返回 消息 班级,又名班级 代理 班级,又名班级 Data Transfer Objects 它是非常简单、轻量级的POCO类,没有任何实际状态或智能,特别是没有非托管资源的所有权。

    你可以使用像这样的工具 AutoMapper 在域模型类之间快速轻松地映射 Customer (它显然保留了数据库连接)和您的Web服务使用的DTO。

        2
  •  1
  •   Will    15 年前

    此规则可能有例外,但在大多数情况下,如果函数向您返回IDisposable对象,则现在您需要处理它。

    这就是为什么你看到“泄露”。是的,GC将在需要内存时及时清理它,但在清理之前,潜在重要的资源将保持锁定/使用中。

    所以记住规则:它是可识别的,完成后处理它!

    =)