启动Windows服务时出现TypeInitializationException错误,因为无法创建配置节。

15

在一个特定的Windows Server 2008 R2机器上出现了奇怪的错误(它在其他2008 R2机器上可以正常工作),当启动Windows服务时。该服务使用Common.Logginglog4net

然而,在这个特定的机器上,无法创建Common.Logging的配置部分处理程序。

它失败并显示以下堆栈跟踪(为更好的可读性进行格式化)。最让我惊讶的是SecurityException。这是什么原因呢?

有人有线索吗?

System.TypeInitializationException: The type initializer for
    'MyWindowsService.Program' threw an exception.
--->
Common.Logging.ConfigurationException: Failed obtaining configuration for
    Common.Logging from configuration section 'common/logging'.
--->
System.Configuration.ConfigurationErrorsException: An error occurred creating
    the configuration section handler for common/logging: Request failed.
    (C:\Path\MyWindowsService.exe.Config line 7)
--->
System.Security.SecurityException: Request failed.
at System.RuntimeTypeHandle.CreateInstance(
    RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached,
    RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck)
at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis,
    Boolean fillCache)
at System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly,
    Boolean skipVisibilityChecks, Boolean skipCheckThis, Boolean fillCache)
at System.Activator.CreateInstance(Type type, Boolean nonPublic)
at System.Configuration.TypeUtil.CreateInstanceWithReflectionPermission(Type type)
at System.Configuration.RuntimeConfigurationRecord.RuntimeConfigurationFactory.Init(
    RuntimeConfigurationRecord configRecord, FactoryRecord factoryRecord)
at System.Configuration.RuntimeConfigurationRecord.RuntimeConfigurationFactory.InitWithRestrictedPermissions(
    RuntimeConfigurationRecord configRecord, FactoryRecord factoryRecord)
at System.Configuration.RuntimeConfigurationRecord.CreateSectionFactory(
    FactoryRecord factoryRecord)
at System.Configuration.BaseConfigurationRecord.FindAndEnsureFactoryRecord(
    String configKey, Boolean& isRootDeclaredHere)
--- End of inner exception stack trace ---

它继续说道:

at System.Configuration.BaseConfigurationRecord.FindAndEnsureFactoryRecord(
    String configKey, Boolean& isRootDeclaredHere)
at System.Configuration.BaseConfigurationRecord.GetSectionRecursive(
    String configKey, Boolean getLkg, Boolean checkPermission, Boolean getRuntimeObject,
    Boolean requestIsHere, Object& result, Object& resultRuntimeObject)
at System.Configuration.BaseConfigurationRecord.GetSection(String configKey)
at System.Configuration.ConfigurationManager.GetSection(String sectionName)
at Common.Logging.LogManager.<>c__DisplayClass6.<BuildLoggerFactoryAdapter>b__3()
at Common.Logging.Configuration.ArgUtils.<>c__DisplayClass13.<Guard>b__12()
at Common.Logging.Configuration.ArgUtils.Guard[T](Function`1 function,
    String messageFormat, Object[] args)
--- End of inner exception stack trace ---

at Common.Logging.Configuration.ArgUtils.Guard[T](Function`1 function,
    String messageFormat, Object[] args)
at Common.Logging.LogManager.BuildLoggerFactoryAdapter()
at Common.Logging.LogManager.get_Adapter()
at Common.Logging.LogManager.GetLogger(Type type)
at MyWindowsService.Program..cctor()
--- End of inner exception stack trace ---

at MyWindowsService.Program.Main(String[] args)

我的配置看起来像这样(至少是 Common.Logging 的部分)。

<configSections>
  <sectionGroup name="common">
    <section name="logging"
             type="Common.Logging.ConfigurationSectionHandler, Common.Logging" />
  </sectionGroup>
</configSections>

<common>
  <logging>
    <factoryAdapter
     type="Common.Logging.Log4Net.Log4NetLoggerFactoryAdapter,Common.Logging.Log4net">
      <arg key="configType" value="INLINE" />
    </factoryAdapter>
  </logging>
</common>

你的配置文件长什么样子? - Jon Skeet
其实非常基础。我认为这并不重要,因为在其他机器上它完美地运行。但是我还是会发布相关部分。 - Ronald Wildenberg
4个回答

18

我注意到客户从我们网站下载我们的zip(ASP.NET应用程序)文件时,会发生奇怪的事情。由于安全功能“这个文件来自另一台计算机,可能被阻止以帮助保护此计算机”。

解除文件的阻止可以解决所有奇怪的问题,这就解释了为什么只有在某些配置完全相同的计算机上才会发生这种情况。


只有当文件在文件属性对话框的常规选项卡中实际被阻止时,才会显示“解除阻止”选项:

enter image description here


你的回答可能为我节省了数小时的调试时间。谢谢! - Jacob
这对我解决了问题。谢谢。我在寻找取消阻止命令时遇到了一些麻烦,所以我编辑了答案并添加了截图。 - Sergio Acosta

3

您还可以在Visual Studio 2013中检查以下内容:Project(项目)> Properties(属性)> Application Tab(应用程序选项卡)> Startup Object(启动对象)下拉菜单,是否配置为指向Windows服务的Program类。如果未设置该值,则该服务将无法启动并出现System.TypeInitializationException异常。


1

这是.NET 4.0吗?框架可能存在错误...请参见https://dev59.com/MHE85IYBdhLWcg3wikIu的已接受答案...除非您只在远程调试时遇到此问题,否则仍无法解释为什么它在不同的机器上运行,好吧,我猜你不会因为你说它发生在启动服务时。 - Richard Anthony Freeman-Hein
请参见http://social.msdn.microsoft.com/Forums/en-US/clr/thread/1e14f665-10a3-426b-a75d-4e66354c5522...这是.NET 4.0已知的问题。 - Richard Anthony Freeman-Hein
啊,我自己还没有发现这个。谢谢。问题出现在客户的测试环境中,所以变得有点棘手了。 - Ronald Wildenberg
这似乎不是同一个问题。在运行了提出的解决方法之后,问题仍然存在。你有其他的想法吗? - Ronald Wildenberg

0

对我来说问题是因为我从网络映射的驱动器中运行可执行文件,而这被.NET视为不安全


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