我发现当我使用 HttpWebRequest 建立 SSL\TLS 连接时,调用时需要将近 30s
request.GetRequestStream()
当我在启用堆栈跟踪的情况下启用跟踪时,我发现 2s 去寻找 poxy,所以我在 app.config 中禁用了它:
<system.net>
<defaultProxy enabled="false" useDefaultCredentials="false">
<proxy/>
<bypasslist/>
<module/>
</defaultProxy>
</system.net>
下一个需要 28 秒左右的时间点在
at System.Net.Security.SecureChannel.AcquireClientCredentials(Byte[]& thumbPrint)
在检查方法主体后,我发现调用 X509Chain.Build() 并且花了将近 25 秒来构建证书链。
有趣的是,当您构造新的 HttpWebReqest 并再次尝试(无需重新启动应用程序)时,执行请求需要几个毫秒。
谁能建议该怎么做?缓存请求不是一个选项,它应该从应用程序运行开始很快。
更新:
我在 X509Chain.BuildChain() 中发现需要 30 秒的调用,它是:
if (!CAPISafe.CertGetCertificateChain(hChainEngine, pCertContext, ref pTime, invalidHandle, ref cert_chain_para, dwFlags, IntPtr.Zero, ref ppChainContext))
CAPISafe 中声明的方法为:
[DllImport("crypt32.dll", CharSet = CharSet.Auto, SetLastError = true)]
internal static extern bool CertGetCertificateChain([In] IntPtr hChainEngine, [In] SafeCertContextHandle pCertContext, [In] ref System.Runtime.InteropServices.ComTypes.FILETIME pTime, [In] SafeCertStoreHandle hAdditionalStore, [In] ref CAPIBase.CERT_CHAIN_PARA pChainPara, [In] uint dwFlags, [In] IntPtr pvReserved, [In, Out] ref SafeCertChainHandle ppChainContext);
所以,是 Crypto API 函数CertGetCertificateChain 还是不知道,接下来要做什么......
更新:
我试图禁用 CRL 和 OCSP 检查,仍然没有效果:
添加到 App.config
<runtime> <generatePublisherEvidence enabled="false"/> </runtime>
机器范围:控制面板 -> Internet 选项 -> 高级 -> 在安全下,取消选中检查发布者的证书吊销选项
在注册表中:
[HKEY_USERS\S-1-5-20\Software\Microsoft\Windows\CurrentVersion\WinTrust\Trust Providers\Software Publishing] "状态"=dword:00023e00