【发布时间】:2013-11-15 00:34:29
【问题描述】:
我有一个 .NET 3.5 桌面应用程序,每当它所在的测试机器不在办公室时,它的功能就会周期性地变慢。
我设法在没有互联网连接的办公室机器上复制错误,但只有当我使用 ANTS 性能分析器时,我才能更清楚地了解正在发生的事情。
在 ANTS 中,我看到“等待同步”长达 16 秒,这与我在 NHibernate 尝试加载 System.Data.SqlServerCE.dll 程序集时在应用程序中看到的延迟相对应。
如果我立即再次尝试该操作,它将立即生效,但如果我将其放置 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,但这不对我有用。
NHibernate 正在动态加载 SQLServerCE dll,我想知道它是动态的事实是否可能是该设置不起作用的原因,但我不知道如何检查。
任何人都可以就配置设置可能不起作用的原因提供建议吗?
或者是否有另一种方法可以在应用程序级别禁用检查,也许是一个 CAS 策略设置,我可以使用它在安装应用程序时为其设置异常?
或者我可以在应用程序中进行更改以提高信任级别或类似的东西吗?
【问题讨论】:
-
你能在服务器上安装GAC中的sqlserverCE程序集吗?,当程序集安装在GAC中时,这些程序集在加载时没有验证,只在GAC中安装时检查,查看这篇文章:msdn.microsoft.com/en-us/magazine/cc163610.aspx
-
我无法从 GAC 中的应用程序注册 System.Data.SqlServerCe.dll,因为它是私有部署版本。更改为桌面版本允许它从 GAC 加载,但对性能没有任何影响。我在 ProcessMonitor 中看到其他 sqlce dll(例如 sqlceer40EN.dll)也正在加载(从 SQL Server CE 安装目录),当第一个加载时,我看到 15 秒延迟并调用 WinTrustVerify 等.,但它们不能在 GAC 中注册,因为它们不是 .NET dll,那么为什么要对它们进行 CRL 检查?
-
似乎无法设置超时来禁用证书吊销,但请查看此页面:fix slow application startup 这个人解释了如何在 Windows 注册表中设置请求中的超时,如果您设置一个低值,然后会喜欢禁用。
-
这里说how certificate revocation works 默认超时为 15 秒,这与 ANTS 时间检测到的“等待同步”事件一致
-
您可以做的另一件事是,使用您的应用程序更改注册表并将超时设置为尽可能低。
标签: c# nhibernate certificate code-access-security certificate-revocation