6

1、2週間前にライブアプリケーションで多くのエラーが発生しましたが、これまでのところ説明を逃れています。これらのエラーは内部で確認され、一連のWebサービスで明らかになったときにクライアントにも発生しました。

以下に内部例外を含めました。プロジェクトはCSLAフレームワークを使用しており、データベースからオブジェクトを取得するときにエラーが発生しました。

エラーが発生し始めた時点では、システムに既知の変更は加えられていません。インフラストラクチャは、多数の負荷分散Webサーバーで構成されています。

エラーはサーバーの1つに限定されているようで、Webサービスに接続するコンソールアプリケーションを使用してエラーが発生しました。問題のサーバーは、ローカルDMZ IPを使用してhostsファイル内のWebサービスを解決していましたが、これを外部に強制することで、問題が解決したようです。

これを分離することは、アプリケーションとインフラストラクチャの間の非常に細かい線のように思われるので、これを説明できる可能性のあるアイデアや理論を誰かが持っているのではないかと思います。

<InnerException>
      <ExceptionType>System.InvalidOperationException, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ExceptionType>
      <Message>Exception of type 'System.InvalidOperationException' was thrown.</Message>
      <Source>mscorlib</Source>
      <HelpLink />
      <Property name="Data">System.Collections.ListDictionaryInternal</Property>
      <Property name="TargetSite">Void VerifyIntegrity()</Property>
      <StackTrace>   at System.Runtime.CompilerServices.ConditionalWeakTable`2.VerifyIntegrity()
   at System.Runtime.CompilerServices.ConditionalWeakTable`2.Add(TKey key, TValue value)
   at System.Linq.Expressions.Expression..ctor(ExpressionType nodeType, Type type)
   at System.Data.Linq.SqlClient.Translator.TranslateLink(SqlLink link, List`1 keyExpressions, Boolean asExpression)
   at System.Data.Linq.SqlClient.SqlBinder.Visitor.ConvertToFetchedExpression(SqlNode node)
   at System.Data.Linq.SqlClient.SqlBinder.Visitor.ConvertLinks(SqlExpression node)
   at System.Data.Linq.SqlClient.SqlBinder.Visitor.FetchExpression(SqlExpression expr)
   at System.Data.Linq.SqlClient.SqlBinder.Visitor.VisitMember(SqlMember m)
   at System.Data.Linq.SqlClient.SqlVisitor.Visit(SqlNode node)
   at System.Data.Linq.SqlClient.SqlBinder.Visitor.VisitExpression(SqlExpression expr)
   at System.Data.Linq.SqlClient.SqlBinder.Visitor.VisitNew(SqlNew sox)
   at System.Data.Linq.SqlClient.SqlVisitor.Visit(SqlNode node)
   at System.Data.Linq.SqlClient.SqlBinder.Visitor.VisitExpression(SqlExpression expr)
   at System.Data.Linq.SqlClient.SqlBinder.Visitor.VisitSelect(SqlSelect select)
   at System.Data.Linq.SqlClient.SqlVisitor.Visit(SqlNode node)
   at System.Data.Linq.SqlClient.SqlBinder.Visitor.VisitAlias(SqlAlias a)
   at System.Data.Linq.SqlClient.SqlVisitor.Visit(SqlNode node)
   at System.Data.Linq.SqlClient.SqlVisitor.VisitSource(SqlSource source)
   at System.Data.Linq.SqlClient.SqlBinder.Visitor.VisitSelect(SqlSelect select)
   at System.Data.Linq.SqlClient.SqlVisitor.Visit(SqlNode node)
   at System.Data.Linq.SqlClient.SqlBinder.Visitor.VisitIncludeScope(SqlIncludeScope scope)
   at System.Data.Linq.SqlClient.SqlVisitor.Visit(SqlNode node)
   at System.Data.Linq.SqlClient.SqlBinder.Bind(SqlNode node)
   at System.Data.Linq.SqlClient.SqlProvider.BuildQuery(ResultShape resultShape, Type resultType, SqlNode node, ReadOnlyCollection`1 parentParameters, SqlNodeAnnotations annotations)
   at System.Data.Linq.SqlClient.SqlProvider.BuildQuery(Expression query, SqlNodeAnnotations annotations)
   at System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query)
   at System.Data.Linq.DataQuery`1.System.Linq.IQueryProvider.Execute[S](Expression expression)
   at System.Linq.Queryable.SingleOrDefault[TSource](IQueryable`1 source)
   at NamespaceA.DaSql.NamespaceB.NamespaceBContext.NamespaceA.Da.NamespaceB.INamespaceBContext.GetClassA(Int32 objectId)
   at NamespaceA.NamespaceB.ClassA.DataPortal_Fetch(SingleCriteria`2 criteria)
   at dm(Object , Object[] )
   at Csla.Reflection.MethodCaller.CallMethod(Object obj, DynamicMethodHandle methodHandle, Object[] parameters)</StackTrace>
    </InnerException>

助けや理論を事前に感謝します。

編集 :

完全な例外はここにあります

以下のLINQtoSQLには何もありません。ObjectAは、プロパティを持つ単なるラッパークラスです。IDに基づいて1つのオブジェクトを選択して入力するだけです。ctxはCSLAContextManagerです。

var data = from d in ctx.DataContext.ObjectAs
                           where d.ObjectId == objectId
                           select new ObjectA
                            {
                                Id = d.DispatchId,
                                ClientId = d.ClientId,
                                DateCreated = d.DateCreated
                            };

                return data.SingleOrDefault();
4

3 に答える 3

2

添付した内部例外が表示されます。例外として、SingleOrDefault()メソッドが実行されたときに作成されるコレクションに問題がある可能性があります(LINQは実行が延期されます)。

コレクションの作成を少し深く掘り下げると、問題と解決策をよりよく分析するのに役立つ可能性のある2つのリンクを投稿します。これらのリンクが問題の解決に役立つことを願っています。

リンク1:http : //typedescriptor.net/browse/members/289638-System.Runtime.CompilerServices.ConditionalWeakTable%602%5BTKey,TValue%5D.VerifyIntegrity()

リンク2:http ://code.google.com/p/bclcontrib-abstract/source/browse/%2BFromCoreEx/%2BKludge/Runtime/CompilerServices/ConditionalWeakTable.cs?spec=svnd7b68d68e34be8e5db308feaccf935afd2c1b8d9&name=d7b68

原因となるメソッドは、ConditionalWeakTable.Add()およびConditionalWeakTable.VerifyIntegrity()である可能性があります。

上記のポインタは、解決策にたどり着くのに役立つはずです。ありがとう

于 2011-10-08T17:37:52.550 に答える
0

msdnのドキュメントに示されているように、メソッドが複数の要素を含むシーケンスで呼び出されたInvalidOperationException場合にスローされる可能性があると思います。代わりに使用できる可能性があります。SingleOrDefault()FirstOrDefault()

お役に立てれば。

于 2011-10-04T14:28:32.460 に答える
0

ブレークポイントを設定します

return data.SingleOrDefault();

ライン。次に、データにマウスを合わせて評価し、期待どおりの結果が返されるかどうかを確認します。例外がスローされたことを示している可能性があります。例外がスローされない場合は、マウスオーバーまたは監視式を追加してdata.SingleOrDefault()を評価し、例外が発生するかどうかを確認してください。

また、クエリをステップごとに1つに分割し、各ステップで評価して、どの呼び出しが例外を引き起こしているかを特定することもできます。

元:

// break execution and evaluate each one separately
var table = ctx.DataContext.ObjectAs;
var filter = table.Where(x => x.ObjectId == objectId);
var select1 = filter.Select(x => x.DispatchId);
var select2 = filter.Select(x => x.ClientId);
var select3 = filter.Select(x => x.DateCreated);
var select4 = filter.Select(x => new ObjectA
                  {
                            Id = d.DispatchId,
                            ClientId = d.ClientId,
                            DateCreated = d.DateCreated
                  };
var singleOrDefault = select4.SingleOrDefault();

これにより、クエリのどの部分で問題が発生しているかが絞り込まれます。

于 2011-10-08T19:03:37.193 に答える