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 считает незащищенным