【问题标题】:Memory Leak When SSL and Client Certificates Are Used With the HttpWebRequest Object将 SSL 和客户端证书与 HttpWebRequest 对象一起使用时的内存泄漏
【发布时间】:2011-05-21 15:40:21
【问题描述】:

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

FIX: Memory Leak When SSL and Client Certificates Are Used With the HttpWebRequest Object

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


 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 对象具有泄漏内存的字节数组,我正在处理流和请求对象。

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

【问题讨论】:

  • 我们无法帮助您拨打电话号码。
  • 如果您注意到文章 ID:831578 - 上次评论:2005 年 10 月 25 日 - 修订:1.5 我想也许有人遇到过同样的问题已经 6 年了。
  • 该泄漏仅适用于 .NET 1.1。为什么你相信你会遇到它? (假设你没有运行 1.1)
  • @blowdart:因为当我停止使用 SSL 时,内存泄漏不再存在。
  • 但是您还没有说如何检测泄漏,毕竟很难找出托管代码中的泄漏,可能只是 GC 还没有清除。或者更进一步,您正在执行流操作而不是处理流。在任何人提供帮助之前,这需要更多信息 - 如何检测泄漏、数字是多少、windbg 堆栈转储、围绕这四行的其余代码等。知识库文章尚未更新的事实表明该修复程序已进入 2.0 及更高版本。

标签: c# windows ssl memory-leaks httpwebrequest


【解决方案1】:

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

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

注意:框架会在创建 SSL 会话时对其进行缓存,并在可能的情况下尝试为新请求重用缓存的会话。尝试重用 SSL 会话时,框架使用 ClientCertificates 的第一个元素(如果有),或者如果 ClientCertificates 为空,则尝试重用匿名会话。

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

或者尝试使用这个:

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

【讨论】:

  • @Yahya - 有没有办法确定服务器是否要求客户端证书?
【解决方案2】:

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

要开始,您可以阅读

如果在那之后,您确实认为这是一个 .NET 框架错误,而不是在您自己的代码中,请报告它。有几种方法可以做到这一点,通过Connect,或者如果这对您影响很大,您可以向 Microsoft 发送support incident。如果您选择支持事件路线,您将需要一张信用卡。如果您的问题是由 .NET 框架中的错误引起的,则不会向您收费。

【讨论】:

    猜你喜欢
    • 2012-03-03
    • 2012-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-12
    • 2010-12-24
    • 2013-01-19
    • 1970-01-01
    相关资源
    最近更新 更多