2010-08-10 62 views
15

啓動Windows服務時,在特定的Windows Server 2008 R2計算機上(它適用於其他2008 R2計算機)出現奇怪的錯誤。該服務使用Common.Logginglog4net。但是,在此特定計算機上,Common.Logging的配置節處理程序無法創建。TypeInitializationException啓動Windows服務時因爲無法創建配置部分

它失敗,出現以下堆棧跟蹤(格式化爲更好的可讀性)。我最驚訝的是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

那麼你的配置文件是什麼樣子? – 2010-08-10 18:18:45

+0

其實非常基本。我認爲這並不重要,因爲它在其他機器上完全正常工作。但我會無論如何發佈相關部分。 – 2010-08-10 18:22:08

回答

17

當客戶從我們的網站下載我們的zip(ASP.NET應用程序)文件時,我看到了奇怪的事情。由於安全功能「此文件來自另一臺計算機並可能被阻止以幫助保護此計算機」。

解除文件解鎖解決了所有奇怪的問題,這可以解釋爲什麼這只是發生om 一些具有完全相同的配置的計算機。


的阻止選項僅顯示在文件實際上是阻止在文件屬性對話框的常規選項卡:

enter image description here

+0

你可能用這個答案節省了我幾個小時的調試時間。謝謝! – Jacob 2011-05-18 08:03:08

+0

這解決了我的問題。謝謝。我在查找unblock命令時遇到了一些麻煩,所以我編輯了de回答以添加屏幕截圖。 – 2012-03-22 17:39:43

+0

@Flores你的傳奇 – heymega 2014-11-28 12:43:48

1

好像您需要授予服務帳戶訪問配置文件的權限。
編輯:其實第二眼看起來似乎不是這樣的問題,因爲它實際上是讀取配置文件,但你應該仔細檢查權限。

更新:這是.NET 4.0的已知問題,但有一個解決方法 - 請參閱http://social.msdn.microsoft.com/Forums/en-US/clr/thread/1e14f665-10a3-426b-a75d-4e66354c5522

+0

是的,它已經在閱讀它了。但我會檢查。 – 2010-08-10 18:44:30

+0

這是.NET 4.0嗎?框架中可能存在錯誤...請參閱http://stackoverflow.com/questions/2725432/net-4-0-application-on-network-share-causes-securityexception的接受答案...仍然會不解釋爲什麼它可以在另一臺機器上工作,除非您只在遠程調試時才能獲得此功能。好吧,我想你不是因爲你說這是在你開始服務時發生的。 – 2010-08-10 18:54:28

+0

請參閱http://social.msdn.microsoft.com/Forums/en-US/clr/thread/1e14f665-10a3-426b-a75d-4e66354c5522 ...這是.NET 4.0的一個已知問題 – 2010-08-10 18:59:27

3

您也可以,如果項目檢查在Visual Studio 2013> 「屬性」>「應用程序」選項卡>「啓動對象」下拉列表被配置爲指向Windows服務的「程序」類。如果該值未設置,則該服務將無法以System.TypeInitializationException啓動。

0

竟然對我來說,因爲我是從.NET認爲不安全的網絡映射驅動器運行可執行

相關問題