.NET执行托管应用程序时,最耗时的检查是什么?

4
我开发了一个基于.NET的Windows服务,它使用了部分托管的C#代码和非托管的C/C++库。
在某些域环境中(例如域abc.com中的Win 2k3 32位服务器),有时服务需要超过30秒才能启动(尤其是在操作系统重新启动时),因此无法启动服务。我怀疑这与企业级安全有关,但我不确定。

http://msdn.microsoft.com/en-us/library/aa720255%28VS.71%29.aspx

我尝试了以下方法,但都没有成功: - 通过将using指令尽可能远离servicebase实现来延迟加载引用(特别是xml命名空间-已知会导致加载延迟) - 延迟加载和配置log4net - 通过使用ngen对代码进行预编译 - 延迟启动工作线程 - 添加/删除内部设置及其依赖项 - 对二进制文件进行签名/取消签名 - 在尽可能晚的时候使用配置设置(有很多设置,所有范围级别都设置为应用程序) - 将所有依赖项添加到GAC中
我还没有尝试为实现Main方法的类添加安全性要求。 我还没有尝试实现自己的配置加载器,因为在检查自动生成的代码后,我注意到设置类是单例模式,并在调用时获取其实例。
完全删除log4net依赖后,它可以正常工作,但这不是一个选项。
当禁用网络卡时,服务立即启动。

你能把所有的代码从主线程中移动吗? - Sergey Mirvoda
您的log4net日志的目标是什么?是否可能依赖于另一个服务(例如SQL Server)?如果是这样,您当然可以限制您的服务在其他服务启动后才开始启动。 - Jay
2个回答

1

通常情况下,您可以使用SysInternals的Process Monitor来诊断此问题。由于这是一个服务,所以事情变得更加复杂。请查看此博客文章以获取类似的故障排除会话。

顺便说一句,它听起来像是CRL(证书吊销列表)问题。要禁用它:控制面板,Internet选项,高级选项卡,安全性,取消选中“检查发布者的证书吊销”。


我已经实现了一个简单的控制台应用程序,并使用WinDbg。在查看windbg输出后,我注意到其中一个依赖项 - 一个C++库在应用程序启动后被加载,配置和xml命名空间确实被加载,并且需要59秒来加载下一个 - culture。ModLoad:MyDependencyDll.dll。C:\WINDOWS\assembly\NativeImages_v2.0.50727_32\System.Xml\5913d3f81e77194ec833991b1047a532\System.Xml.ni.dll(d18.afc):CLR异常 - 代码e0434f4d(第一次机会)。C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\culture.dll。 - ltorje
在使用procxp查找后,我发现一个正在使用WinHTTP-QueryDNS的线程和另一个正在等待与密码学相关的第一个线程。注意:我的所有二进制文件都使用有效的VeriSign证书进行数字签名。在从网络连接中删除DNS条目后,服务就像魔术般地工作了(如果二进制文件没有签名也是一样)。我推测它试图检查证书是否有效,甚至尝试从证书中解析名称,但由于没有互联网连接,它无法完成。我该如何防止它这样做? - ltorje
@ltorje - 是的,现在它真的大声喊出CRL了。我更新了我的答案,展示了如何关闭它。 - Hans Passant
我忘了提到,我已经按照http://weblogs.sqlteam.com/tarad/archive/2006/10/05/13676.aspx中的步骤进行操作,但并没有成功-禁用CRL。 我甚至尝试将证书添加到可信发布者中。 请注意:用于签署代码的证书基于VeriSign Class 3 Code Signing 2009-2 CA。http://www.amug.org/~glguerin/opinion/revocation.html - ltorje
在 hosts 中将 crl.microsoft.com 设置为 127.0.0.1 也无法解决问题。 - ltorje

0
我们发现使用带有名称解析的log4net UDP appender(即使是到12.0.0.1)会导致启动速度极慢。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接