2010-11-22 34 views
4

私は、ASP.NET 3.5、NHibernate 2.2、およびDependency InjectionのためのSprint .NETで動作するサイトを持っています。私たちのテストサーバーでは、むしろ奇妙なエラーが発生し、また、ほぼいつでも、複数のユーザーがオンラインになっています。問題が発生すると、IISRESETを実行するまで、このエラーはすべてのユーザーと要求ごとに表示されます。その後、もう一度OKです。ここで奇妙なエラー:[ArgumentOutOfRangeException: 'count'は負でない必要があります

は例外です:

'count' must be non-negative. 
Parameter name: count 
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.ArgumentOutOfRangeException: 'count' must be non-negative. 
Parameter name: count 

Source Error: 
[No relevant source lines] 

Source File: c:\Windows\Microsoft.NET\Framework64\v2.0.50727\Temporary ASP.NET  Files\root\4bf9aa39\6dcf5fc6\App_Web_z9ifuy6t.6.cs Line: 0 

Stack Trace: 
[ArgumentOutOfRangeException: 'count' must be non-negative. 
Parameter name: count] 
System.String.CtorCharCount(Char c, Int32 count) +10082288 
Spring.Objects.Factory.Support.AbstractObjectFactory.GetObjectInternal(String name, Type requiredType, Object[] arguments, Boolean suppressConfigure) +3612 
Spring.Objects.Factory.Support.AbstractObjectFactory.GetObject(String name) +75 
Spring.Objects.Factory.Support.DefaultListableObjectFactory.GetObjectsOfType(Type type, Boolean includePrototypes, Boolean includeFactoryObjects) +365 
Spring.Context.Support.AbstractApplicationContext.GetObjectsOfType(Type type, Boolean includePrototypes, Boolean includeFactoryObjects) +136 
Spring.Context.Support.AbstractApplicationContext.GetObjectsOfType(Type type) +66 


[ActivationException: Activation error occured while trying to get instance of type InfoTextService, key ""] 
    Microsoft.Practices.ServiceLocation.ServiceLocatorImplBase.GetInstance(Type serviceType, String key) in  c:\Home\Chris\Projects\CommonServiceLocator\main\Microsoft.Practices.ServiceLocation\ServiceLocatorImplBase.cs:57 
Microsoft.Practices.ServiceLocation.ServiceLocatorImplBase.GetInstance() in c:\Home\Chris\Projects\CommonServiceLocator\main\Microsoft.Practices.ServiceLocation\ServiceLocatorImplBase.cs:90 
OurProjectsNamespace.Infrastructure.ObjectLocator.LocateService() +86 

答えて

3

これは実際には非常に間違ったエラーです。あなたが見ている

[ThreadStatic] 
private int nestingCount; 

protected object GetObjectInternal(...) 
{ 
    const int INDENT = 3; 
    bool hasErrors = false; 
    try 
    { 
     nestingCount++; 

     if (log.IsDebugEnabled) 
     { 
      log.Debug("msg" + 
       new String(' ', nestingCount * INDENT)); 
     } 

     // More code: Calls self recursively. 
    } 
    catch 
    { 
     nestingCount--; 
     hasErrors = true; 

     if (log.IsErrorEnabled) 
     { 
      log.Error("msg" + 
       new String(' ', nestingCount * INDENT)); 
     }   
    } 
    finally 
    { 
     if (!hasErrors) 
     { 
      nestingCount--; 
      if (log.IsDebugEnabled) 
      { 
       log.Debug("msg" + 
        new String(' ', nestingCount * INDENT)); 
      }   
     } 
    } 
} 

例外は3つのnew String(' ', nestingCount * INDENT)の呼び出しのいずれかによってスローされている必要があります。あなたはAbstractObjectFactory.GetObjectInternalあなたは、次の構造が表示されますのソースを見てみるとその特定のstringコンストラクタ呼び出しは、指定された値が負の場合にスローします。 INDENTはconstなので、nestingCountはその場合負の値を持たなければなりません。 nestingCountはスレッドスタティック変数です。スレッド静的変数は、常にデフォルト値(この場合は0)で初期化され、他のスレッドの影響を受けることはできません。さらに、nestingCountは決してこのメ​​ソッドの外側で使用されません。

nestingCountはスレッドスタティックであり、その方法でのみ使用されるため、nestingCountが否定的になる可能性があると想像するのは難しいです。おそらく非同期(ThreadAbort)例外の場合でも、これは私が想像するのは難しいでしょう。他の選択肢は、スレッド静的変数がリフレクションを使用して他の誰かによって変更されることです。

しかし大きな問題は、これを解決する方法ですか?

ソリューション:

私は考えることができ、かつ、デバッグ情報が記録されていないような方法で再構成log4netのある一つだけの事はあります。デバッグ情報を無効にすると、おそらくコンストラクタstring(char, int)が再度呼び出されることはなく、問題を隠すことになります。非常にきれいではありませんが、おそらく効果的です。あなたは、グローバルにlog4netでデバッグ情報の書き込みを無効にすることで、これを行うことができ

this.log = LogManager.GetLogger(this.GetType()); 

か、これがでoverkill-いると思う-when:これは、次のように初期化されlog変数を使用してAbstractObjectFactoryログので、うまくいくかもしれませんタイプSpring.Objects.Factory.Support.DefaultListableObjectFactory(実際に例外を引き起こすインスタンス)のデバッグ情報を無効にするには、log4netを設定します。

幸運。

+0

Spring.Objects.Factory.Support.DefaultListableObjectFactoryのデバッグを無効にすることは効果があります。私はこれを試してエラーが発生しないことを再度確認します。エラーは間違いなく奇妙ですが、かなり面白いです。うまくいけば、基本的な原因はこのエラーに限定されます...ありがとうスティーブン!新しいものがあれば私は投稿を更新しておきます。 – Mattias

+0

@Mattias:私の所見が正しかったかどうか、またデバッグを無効にしても実際に問題が解決したかどうかは非常に不思議です。 – Steven

+0

うまくいけば、私はすぐにあなたに答えを与えることができます。これはまだ生きていない実動サーバーでのみ発生します。だから、次回のアップデートの後に私たちは見るでしょう。 – Mattias

0

データベース列が複数のプロパティにマップされたとき、私はこのエラーが発生し見てきました。典型的なケースは、外部キー列がプロパティおよびコレクションにマップされる場合です。設定ファイルの目の2番目または3番目のペアは、これらを見つけるのに役立ちます。

これは、すべてのユーザーに発生するということです。アプリケーション状態で保存されている永続オブジェクトがありますか?

+0

機密性のためにすべてのコードを投稿できませんが、配置されているオブジェクトは、コンストラクタ引数としてのISessionとExceptionHandlerを持つ内部オブジェクトです。オブジェクトが初期化されているときにエラーが表示されます。 – Mattias

0

私のケースでは、このエラーはパフォーマンステスト中しばらくしてから発生しました。それはうまく始まり、しばらくするとこのエラーがポップアップします。

私のコードで使用している全く関係のない[ThreadLocal]変数が原因でした。私はそれをメソッドのパラメータに置き換え、今は正常に動作します。

関連する問題