Веб-службы ASP.NET теряют память при (де) сериализации одноразовых объектов? - PullRequest
0 голосов
/ 26 апреля 2010

В следующих двух случаях, если Клиент является одноразовым (реализует IDisposable), я полагаю, что он не будет утилизирован ASP.NET, что может стать причиной утечки памяти:

    [WebMethod]
    public Customer FetchCustomer(int id)
    {
        return new Customer(id);
    }

    [WebMethod]
    public void SaveCustomer(Customer value)
    {
      // save it
    }

Это (якобы) недостаток распространяется на любой идентифицируемый объект.Поэтому возврат DataSet из веб-службы ASP.NET, например, также приведет к утечке памяти - DataSet не будет удален [EDIT: В этом сообщении утверждается, что Dispose для DataSet ничего не делает, поэтомувозможно, это не такая проблема]

В моем случае Клиент открыл соединение с базой данных, которое было очищено в Dispose, за исключением того, что никогда не вызывался Dispose, что приводило к загрузке незакрытых соединений с базой данных.Я понимаю, что здесь следует целый ряд плохих практик, но дело в том, что ASP.NET - (де) сериализатор - отвечает за удаление этих объектов, так почему бы и нет?

Этопроблема, о которой я знал некоторое время, но никогда не доходил до сути.Я надеюсь, что кто-то может подтвердить то, что я нашел, и, возможно, объяснить, если есть способ справиться с этим.

Ответы [ 2 ]

3 голосов
/ 26 апреля 2010

Это действительно проблема с вашим дизайном, а не с ASP.NET. XmlSerializer, который он использует для сериализации объектов через SOAP, ничего не знает о сериализуемых объектах или о том, реализуют ли они IDisposable. Более того, не сразу видно, что их следует утилизировать, даже если они do реализуют IDisposable; возможно, вы возвращаете одноэлементный экземпляр или объект в кеше.

Веб-службы должны принимать и возвращать классы сообщений , AKA прокси классы, также известные как Объекты передачи данных , которые являются очень простыми и легкими классами POCO без каких-либо реальных государство или разведка и особенно отсутствие права собственности на неуправляемые ресурсы.

Вы можете использовать такой инструмент, как AutoMapper , чтобы быстро и легко отобразить классы модели вашего домена, такие как Customer (которая, очевидно, поддерживает соединение с базой данных), и DTO, которые использует ваша веб-служба.

1 голос
/ 26 апреля 2010

Могут быть исключения из этого правила, но в большинстве случаев, если функция возвращает вам объект IDisposable, теперь ваша проблема в его удалении.

Вот почему вы видите "утечку". Да, со временем GC очистит его, когда потребуется память, но до тех пор, пока это не произойдет, потенциально важные ресурсы останутся заблокированными / используемыми.

Итак, помните правило: это IDisposable, избавьтесь от него, когда закончите!

=)

...