15

Windowsサービスを開始すると、特定のWindows Server 2008 R2マシン(他の2008 R2マシンで動作します)で奇妙なエラーが発生します。このサービスは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>
4

4 に答える 4

18

お客様が当社のWebサイトからzip(ASP.NETアプリケーション)ファイルをダウンロードしたときに、奇妙なことが起こっているのを見てきました。セキュリティ機能のため、「このファイルは別のコンピュータからのものであり、このコンピュータを保護するためにブロックされている可能性があります」。

ファイルのブロックを解除すると、すべての奇妙な問題が解決しました。これは、これがまったく同じ構成の一部のコンピューターでのみ発生する理由を説明します。


[ブロック解除]オプションは、ファイルのプロパティダイアログの[全般]タブでファイルが実際にブロックされている場合にのみ表示されます。

ここに画像の説明を入力してください

于 2010-08-12T09:59:41.380 に答える
3

Visual Studio 2013で、[プロジェクト]>[プロパティ]>[アプリケーション]タブ>[スタートアップオブジェクト]ドロップダウンがWindowsサービスのプログラムクラスを指すように構成されているかどうかを確認することもできます。値が設定されていない場合、サービスはSystem.TypeInitializationExceptionで開始できません。

于 2014-04-04T17:03:25.327 に答える
1

構成ファイルにアクセスするには、サービスアカウントにアクセス許可を与える必要があるようです。
編集:実際には、構成ファイルを実際に読み取っているため、一見問題ではないように見えますが、とにかくアクセス許可を再確認する必要があります。

更新:これは.NET 4.0の既知の問題ですが、回避策があります-http://social.msdn.microsoft.com/Forums/en-US/clr/thread/1e14f665-10a3-426b-a75d-4e66354c5522を参照してください

于 2010-08-10T18:37:55.717 に答える
0

.NETが安全でないと見なすネットワークマップされたドライブから実行可能ファイルを実行していたためであることが判明しました

于 2014-11-15T02:59:58.537 に答える