启动Windows服务时,我在特定的Windows Server 2008 R2计算机上遇到了一个奇怪的错误(它适用于其他2008 R2计算机)。该服务使用Common.Logging和log4net。但是,在此特定计算机上,无法创建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>
答案 0 :(得分:17)
当客户从我们的网站下载我们的zip(ASP.NET应用程序)文件时,我发现了一些奇怪的事情。由于安全功能“此文件来自另一台计算机,可能会被阻止以帮助保护此计算机”。
取消阻止文件解决了所有奇怪的问题,这可以解释为什么只有一些计算机才能完全相同的配置。
只有在文件属性对话框的“常规”选项卡中实际阻止文件时,才会显示“取消阻止”选项:
答案 1 :(得分:3)
如果项目&gt;您也可以在Visual Studio 2013中签入。属性&gt;应用程序选项卡&gt;启动对象下拉列表配置为指向Windows服务的Program类。如果未设置该值,则服务将无法以System.TypeInitializationException启动。
答案 2 :(得分:1)
似乎您需要授予服务帐户权限才能访问配置文件 编辑:实际上第二眼看起来似乎并不是问题,因为它实际上是在阅读配置文件,但你应该仔细检查权限。
更新:这是.NET 4.0的已知问题,但有一种解决方法 - 请参阅http://social.msdn.microsoft.com/Forums/en-US/clr/thread/1e14f665-10a3-426b-a75d-4e66354c5522。
答案 3 :(得分:0)
原来我是因为我从.NET认为不安全的网络映射驱动器运行可执行文件