6

一两周前,我们在实时应用程序中遇到了许多错误,到目前为止还没有得到解释。我们在内部看到了这些错误,客户也遇到了这些错误,因为它体现在一组 Web 服务中。

我在下面包含了内部异常,该项目使用 CSLA 框架,并且在从数据库中检索对象时发生错误。

在我们开始遇到错误时,系统没有进行任何已知的更改,基础设施由许多负载平衡 Web 服务器组成。

这些错误似乎与我们的一台服务器隔离,我们使用连接到 Web 服务的控制台应用程序来体验它们。有问题的服务器使用本地 DMZ IP 来解析其主机文件中的 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>

提前感谢您的任何帮助或理论。

编辑 :

完全例外在这里

下面的 LINQ to SQL,什么都没有,而 ObjectA 只是一个带有属性的包装类。只不过是基于 ID 对一个对象进行简单的选择和填充。ctx 是一个 CSLA 上下文管理器。

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=d7b68d68e3&r=d72cdb68d68dfeaccf934befefe88

罪魁祸首方法可能是 ConditionalWeakTable.Add() 和 ConditionalWeakTable.VerifyIntegrity()

上面的指针应该可以帮助您找到解决方案。谢谢

于 2011-10-08T17:37:52.550 回答
0

我会在

return data.SingleOrDefault();

线。然后,将鼠标悬停在数据上以对其进行评估,并查看它是否返回了您期望的结果。它可能表明抛出了异常。如果没有引发异常,请尝试使用鼠标悬停或添加监视表达式来评估data.SingleOrDefault(),并查看是否出现异常。

您还可以为每个步骤将查询分成一个单独的部分,并在每个步骤中进行评估,以确定哪些调用导致了异常。

前任:

// 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 回答
0

我认为,如msdn 文档中所示,如果在包含多个元素的序列中调用InvalidOperationException该方法,则可能会抛出an ,也许您可​​以改用SingleOrDefault()FirstOrDefault()

希望这可以帮助。

于 2011-10-04T14:28:32.460 回答