18

我有一个.NET 3.5桌面应用程序,每当它所在的测试机器不在办公室时,它就会显示功能的周期性慢速下降。
我设法在没有互联网连接的办公室里的机器上复制错误,但只有当我使用ANTS性能分析器时,我才能更清楚地了解正在发生的事情。禁用Windows上的应用程序的证书吊销检查

在ANTS中,当NHibernate试图加载System.Data.SqlServerCE.dll程序集时,我看到一个“等待同步”最多需要16秒,这相当于应用程序中可以看到的延迟。
如果我立即再次尝试这个动作,它将毫不迟疑地工作,但如果我将它放置了5分钟,那么下次尝试时再次加载时会很慢。

从我的研究到目前为止,这似乎是因为SqlServerCE dll已签名,因此系统正在尝试连接以获取证书吊销列表并超时。
禁用Internet选项LAN设置中的“自动检测设置”设置会导致问题消失,同样禁用“检查发布服务器证书吊销”。
但是,这个应用程序将被部署的管理员不会对禁用每台机器或每个用户的证书检查的想法感到满意,所以我确实需要让应用程序级别禁用CRL检查工作。

在.net 2.0中有详细记录的错误描述了这种行为,并提供了对配置文件元素的可能修复。

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <runtime> 
     <generatePublisherEvidence enabled="false"/> 
    </runtime> 
</configuration> 

这是但是我的工作,即使我使用.NET 3.5。
SQLServerCE dll被NHibernate动态加载,我不知道它是动态的事实可能是为什么设置不起作用,但我不知道如何检查。

任何人都可以提供建议,为什么配置设置可能无法正常工作?
或者还有另外一种方法可以禁用应用程序级别的检查,也许我可以使用CAS策略设置应用程序在安装时设置异常吗?
或者有什么我可以在应用程序中更改信任级别或类似的东西?

+1

你能在GAC在服务器上安装sqlserverCE组装?,当程序集安装在GAC中时,这些程序集在加载时未被验证,只有在安装期间才会在GAC中进行检查,请查看以下文章:http://msdn.microsoft.com/en-us/magazine/cc163610 .aspx – majimenezp

+1

我无法从GAC中的应用程序注册System.Data.SqlServerCe.dll,因为它是私有部署版本。 更改为桌面版本允许从GAC加载,但它对性能没有任何影响。 我的ProcessMonitor看到其他SQLCE的DLL(如sqlceer40EN.dll)被装入了(从SQL Server CE安装目录),并在第一的这些加载我看到15秒的延迟,并呼吁WinTrustVerify,但他们不能在GAC中注册,因为他们不是.NET dll,所以他们为什么要进行CRL检查? –

+1

这似乎是无法设置超时o禁用证书吊销,但检查此页面:[修复应用程序启动缓慢](http://rusanu.com/2009/07/24/fix-slow-application-startup-由于代码签名验证/)这个家伙解释如何在Windows注册表中设置请求中的超时,如果您设置一个较低的值,那么会喜欢禁用。 – majimenezp

回答

2

在这个博客posting(其援引其他来源),你有两个选择:禁止CRL检查系统范围内的或每个应用:

禁止CRL检查机器范围的控制面板 - > Internet选项 - > 高级 - >在安全,取消检查发行商的 证书吊销选项

禁止CRL检查特定.NET应用程序见本 Microsoft知识库文章:http://support.microsoft.com/kb/936707

+0

请阅读问题。 – Nanhydrin

+0

@Nhydhydrin,这不能回答这个问题吗? OP问道:“还有另一种方法可以在应用程序级别禁用检查吗?”这个答案似乎正好处理这个问题。 –

+0

@ Daniel-Schilling,知识库文章说要使用generatePublisherEvidence元素和.NET 2.0的修补程序,对吧?这已经尝试过,并且没有工作,并且应用程序是.NET 3.5,其中包含默认的修补程序。 – Nanhydrin

7

您可以在代码中,如果你想查看每个应用程序吊销列表中指定:

ServicePointManager.CheckCertificateRevocationList = false; 
+0

我试过了,这也没有工作 –

+0

科尔姆, 这是由应用程序发出的第一HttpWebRequest的?我已经看到第一个Web请求由.NET应用程序非常缓慢的情况。 – AnotherDeveloper

+0

似乎没有向Web服务器发出呼叫,我们看到的减速是无法找到连接的超时,因为应用程序没有Web连接,它将等待完全超时,直到它放弃,但是它会每5分钟继续执行一次这个超时,我希望它第一次意识到没有连接,它会停止尝试,但是它不会。我已经尝试过注册表设置来减少这个超时时间,但他们都没有工作 –