TypeInitializationException при запуске службы Windows, поскольку раздел конфигурации не может быть создан
У меня есть странная ошибка на конкретной машине Windows Server 2008 R2 (она работает на других машинах 2008 R2) при запуске службы Windows. Служба использует 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>
Ответы
Ответ 1
Я видел странные вещи, когда клиенты загружали наш zip файл (приложение ASP.NET) с нашего сайта. Из-за функции безопасности "Этот файл пришел с другого компьютера и может быть заблокирован для защиты этого компьютера".
Разблокировка файлов устраняет все странные проблемы, это объясняет, почему это происходит только на некоторых компьютерах с точно такой же конфигурацией.
Параметр "Разблокировать" отображается только тогда, когда файл фактически заблокирован на вкладке "Общие" диалогового окна свойств файла:
![enter image description here]()
Ответ 2
Вы также можете проверить в Visual Studio 2013, если в раскрывающемся списке "Проект" > "Свойства" > "Вкладка" Вкладка " > " Запуск "настроено указать класс программы службы Windows. Если значение не установлено, служба не запустится с исключением System.TypeInitializationException.
Ответ 3
Похоже, вам нужно предоставить разрешения учетной записи службы для доступа к конфигурационному файлу.
EDIT: На самом деле, на первый взгляд это не похоже на проблему, потому что она действительно читает файл конфигурации, но вы должны в любом случае дважды проверять разрешения.
UPDATE: это известная проблема с .NET 4.0, но есть обходной путь - см. http://social.msdn.microsoft.com/Forums/en-US/clr/thread/1e14f665-10a3-426b-a75d-4e66354c5522.
Ответ 4
Оказалось, что я запускаю исполняемый файл с сетевого сопоставленного диска, который .NET считает незащищенным