我们在ASP.NET应用程序中创建了一个X509 Certificate 2对象来进行周期性的传出连接。每次创建这些证书时,都会在以下位置创建一个新文件:
C:\Website\Website\Website\Website
这个文件夹现在有400万个文件从来没有被清理过。
new X509Certificate2(certainty,p12Pwd,X509Keywords Flags. MachineKeySet);
//no X509KeySet Flags. PersistKeySet
但这并没有帮助--仍然会在每个呼叫上获得2KB文件。
当我看到this answer时,我抱了很大的希望,但这是一个2008 R2服务器,临时文件不是0字节,所以这似乎是一个不同的情况。
如何使用X509 Certificate 2而不填满磁盘?
5条答案
按热度按时间ndh0cuux1#
我在我们的服务器上也有同样的问题。我现在找到的最好方法是从我的代码中删除文件。
字符串
8yoxcaq72#
Use .NET 4.6:
X509 Certificate 2从.NET Framework 4.6开始实现IDisposable接口;在.NET Framework的早期版本中,X509 Certificate 2类不实现此接口,因此Dispose方法不存在。
qq24tv8q3#
为了重现你的问题,我创建了这个示例代码。我的测试环境是Windows 8.1 64位,应用程序是用.NET 4.5编写的。
字符串
我感到震惊的是,
C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys
的文件大小上升到2MB。然后应用程序退出,文件大小下降到20K(这可能是它的起始大小)。然后我添加了
cert.Reset();
(我在上面的代码中注解了它)。当你不再需要X509Certificate2
示例时,应该调用它。之后,C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys
的文件大小在20K和22K之间波动。所以我的建议是当你不再需要
X509Certificate2
示例时调用cert.Reset();
。xesrikrc4#
我在我们的服务器上也遇到了同样的问题。目前我发现的最好的方法是通过脚本删除文件(有用的除外)。
例外清单:
通过https://forums.iis.net/t/1224708.aspx?C+ProgramData+Microsoft+Crypto+RSA+MachineKeys+is+filling+my+disk+space
此解决方案仍然是一个修补程序。最好不要在MachineKeys文件夹中生成文件。
4xrmg8kj5#
我试着使用我在这里找到的建议,但在我的情况下,它最终失败了。虽然文件夹开始变少,但一些垃圾是随机留在那里。
我的情况:我正在加载证书以在HttpClient中使用,似乎它卡在了HttpClient中。
我已经实现了所有东西的超类(X509 Certificate 2、HttpClient、HttpClient)来简化这项工作,但是不知道为什么Dispose()方法没有被调用。
也许它与HttpClient池有关,但它似乎被设计为失败-无论你做什么,总会有东西在另一个地方失败。
所以我决定写一个服务,删除它们后,一段时间,最后我设法保持文件夹干净。
这里是:
字符串
您只需要使用该类(AutoResetX 509 Certificate 2)而不是X509 Certificate 2加载证书。
型
注意我实现了我需要的两个构造函数,如果你需要另一个,你可以像这两个一样实现。