Утечка памяти при использовании SSL и клиентских сертификатов с объектом HttpWebRequest - PullRequest
2 голосов
/ 21 мая 2011

Я использую HttpWebRequest объект для загрузки файлов, используя SSL с клиентским сертификатом, у меня есть действующий сертификат на моем сервере, У моего приложения есть проблема утечки памяти, и Microsoft опубликовала что-то, связанное с этой проблемой, на следующемссылка:

ИСПРАВЛЕНИЕ: Утечка памяти при использовании SSL и клиентских сертификатов с объектом HttpWebRequest

Есть ли способ избежать этой утечки памяти, особенно если каждый запросиз-за утечки памяти объемом 8 Кбайт мое приложение будет использовать слишком много памяти.


 HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
 ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback(ValidateRemoteCertificate);
 request.Method = "POST";
 request.ContentType = "text/xml; charset=utf-8";

утечки памяти были обнаружены с помощью .NET Memory Profiler и отображаетУ HttpWebRequest объекта есть массив байтов, который утекает в память, я удаляю объекты потока и запроса.

Я пробовал этот случай с SSL и without SSL, утечки исчезли в не SSLЗапросы.

Ответы [ 2 ]

3 голосов
/ 22 мая 2011

просто установите для свойства AllowWriteStreamBuffering вашего объекта HttpWebRequest значение false:

request.AllowWriteStreamBuffering = false;
request.AllowAutoRedirect = false;

Примечание: Framework кэширует сеансы SSL по мере их создания и пытается повторно использовать кэшированный сеанс для нового запроса., если возможно.При попытке повторно использовать сеанс SSL, Framework использует первый элемент ClientCertificates (если он есть) или пытается повторно использовать анонимные сеансы, если ClientCertificates пуст.

Другое Примечание. Из соображений производительности следует избегатьне добавляйте клиентский сертификат в запрос HttpWebRequest, если только вы не знаете, что его запросит сервер.Для примера кода, иллюстрирующего, как перечислить сертификаты в хранилище сертификатов клиента, см. Класс X509Certificate2Collection.

Или попробуйте использовать это:

request.CachePolicy = new RequestCachePolicy(RequestCacheLevel.NoCacheNoStore); 
2 голосов
/ 21 мая 2011

Вы можете использовать WinDbg, отладчик, который является частью Windows SDK, чтобы лучше изучить, как управляется память для вас. Хотя он не такой дружелюбный, как сторонние варианты, он позволяет вам опускаться и выяснять, действительно ли то, что вы видите, является утечкой. Не существует простого способа определить, в чем заключается ваша проблема, вы создаете новые экземпляры ValidateRemoteCertificate, который, как я полагаю, является вашим кодом, и сам по себе не может освобождать все, что он использует, что, в свою очередь, может привести к тому, что GC не очистит запрос.

Для начала вы можете прочитать

Если после этого вы действительно считаете, что это ошибка .NET framework, а не в вашем собственном коде, сообщите об этом. Есть несколько способов сделать это через Connect , или, если это сильно на вас влияет, вы можете организовать инцидент поддержки *1022* с Microsoft. Если вы идете по маршруту поддержки инцидента, вам понадобится кредитная карта. Если ваша проблема связана с ошибкой в ​​.NET Framework, с вас не будет взиматься плата.

...