当 SSL 和客户端证书与 HttpWebRequest 对象一起使用时出现内存泄漏

本文关键字:泄漏 内存 一起 对象 SSL 客户端 证书 HttpWebRequest | 更新日期: 2023-09-27 17:57:20

我正在使用HttpWebRequest对象通过带有客户端证书SSL上传文件,我的服务器上有一个有效的证书,我的应用程序遇到内存泄漏问题,Microsoft在以下链接上发布了与该问题相关的内容:

修复: 内存泄漏时 SSL 和客户端证书与 httpWebRequest 对象一起使用

是否有任何解决方法可以避免此内存泄漏,特别是每个请求都在消耗8K泄漏的内存,这将导致我的应用程序消耗如此多的内存。


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

使用 .NET 内存探查器检测到内存泄漏,它显示HttpWebRequest对象具有泄漏内存的字节数组,我正在释放流和请求对象。

我已经用SSL尝试过这种情况,without SSL泄漏在非SSL请求中消失了。

当 SSL 和客户端证书与 HttpWebRequest 对象一起使用时出现内存泄漏

只需将HttpWebRequest对象的AllowWriteStreamBuffering属性设置为 false:

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

注意:框架在创建SSL会话时缓存它们,并尝试为新请求重用缓存的会话(如果可能)。尝试重用 SSL 会话时,框架将使用客户端证书的第一个元素(如果有),或者在客户端证书为空时尝试重用匿名会话。

其他注意:出于性能原因,您不应该将客户端证书添加到 HttpWebRequest,除非您知道服务器会要求它。有关演示如何在客户端证书存储中枚举证书的代码示例,请参阅 X509Certificate2Collection 类。

或者尝试使用这个:

request.CachePolicy = new RequestCachePolicy(RequestCacheLevel.NoCacheNoStore); 

您可以使用 WinDbg(作为 Windows SDK 一部分的调试器)来更好地探索如何为您管理内存。虽然不像那里的第三方选项那样友好,但它可以让您降低并弄清楚您所看到的是否确实是泄漏。没有真正简单的方法来判断你的问题在哪里,你创建了 ValidateRemoteCertificate 的新实例,我认为这是你的代码,并且本身可能无法释放它使用的所有内容,这反过来会导致 GC 不清理请求。

要开始使用,您可以阅读

  • 入门:使用 WinDBG 和 SOS 调试 .Net 应用程序中的内存相关问题
  • 你的泄漏在哪里?
  • 跟踪托管内存泄漏(如何查找 GC 泄漏)

如果在那之后,你真的认为这是一个.NET框架错误,而不是在你自己的代码中,那么报告它。有几种方法可以通过 Connect 执行此操作,或者如果这对您造成严重影响,您可以向Microsoft提出支持事件。如果采用支持事件路线,则需要信用卡。如果您的问题是由 .NET 框架中的错误引起的,则不会向您收费。