在我们的 SharePoint 2010 项目中,我们使用 Linq to SharePoint 来获取配置项列表。在我们的测试环境中,我们从未遇到过从此列表中获取数据的问题。在我们的生产环境中,我们现在有时(我们现在找不到模式)在遍历列表中的项目时会出现空引用异常。
下面是从 Linq 到 SharePoint 代码抛出的异常:
你调用的对象是空的。堆栈跟踪: 在 Microsoft.SharePoint.Linq.FieldRef.GetHashCode() 在 Microsoft.SharePoint.Linq.FieldRef.FieldRefEqualityComparer.GetHashCode(FieldRef obj) 在 System.Linq.Set`1.InternalGetHashCode(TElement value) at System.Linq.Set`1.Find(TElement value, Boolean add) at System.Linq.Enumerable.d__7a`1.MoveNext() 在 System.Linq.Buffer`1..ctor(IEnumerable`1 源) 在 System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 源) 在 Microsoft.SharePoint.Linq.SelectMappingInfo.GetDistinctMappedFields() 在 Microsoft.SharePoint.Linq.Rules.PushDownProcessor.SelectWithInfoOp.PushDownSelect(上下文 ctx) 在 Microsoft.SharePoint.Linq.Rules.PushDownProcessor.SelectWithInfoOp.Process(上下文 ctx) 在 Microsoft.SharePoint.Linq.Rules.GuardedRule`4.c__DisplayClass7.b__6(TSourceBase src,TContext ctx) 在 Microsoft.SharePoint.Linq.Rules.RewriteRule`2.Apply(TNode src, TContext ctx) 在 Microsoft.SharePoint.Linq.Rules.CacheRule`3.Apply(TSource src, TContext ctx) 在 Microsoft.SharePoint.Linq.Rules.PushDownProcessor.b__0(表达式 e,上下文 ctx) 在 Microsoft.SharePoint.Linq.Rules.ChildRule`2.Apply(TNode src, TContext ctx) 在 Microsoft.SharePoint.Linq.Rules.PushDownProcessor.b__3(Expression e, Context ctx) 在 Microsoft.SharePoint.Linq.Rules.RewriteRule`2.Apply(TNode src, TContext ctx) 在 Microsoft.SharePoint.Linq.Rules.CacheRule`3.Apply(TSource src, TContext ctx) 在 Microsoft.SharePoint.Linq.SPLinqProvider.Rewrite(表达式表达式,List`1& 假设) 在 Microsoft.SharePoint.Linq.SPLinqProvider.RewriteAndCompile[T](表达式表达式,List`1& 假设) 在 Microsoft.SharePoint.Linq.LinqQuery`1.GetEnumerator() 在 System.Collections.Generic.List`1..ctor(IEnumerable`1 集合) 在 System.Linq.Enumerable.ToList[TSource](IEnumerable`1 源) 在 Common.Configuration.ConfigurationRepository.GetConfiguration(String siteUrl) InnerException: 来源:Microsoft.SharePoint.Linq 目标站点:Int32 GetHashCode()
这里是我们在 GetConfiguration 方法中使用的代码。
using (SpDataContext dataContext = new SpDataContext(siteUrl))
{
result = new ConfigurationModel()
{
Configurations = (from item in dataContext.GasportConfiguration
select new ConfigurationItem()
{
Key = item.Key,
Value = item.Value,
Environment = (Environment)Enum.Parse(typeof(Environment), item.Environment.ToString(), true)
}).ToList()
};
}
任何人都知道如何追踪导致此异常的原因?
2011 年 5 月 31 日更新:
我们找到了一种模式,我们可以通过这种方式在生产环境中重现这种行为。在我们的测试环境中,我们也遇到了这个问题,我们使用 AdPlus 从中提取了一些崩溃转储文件。
我们看到在应用程序池被回收后发生了这种行为。修复此错误的唯一方法是执行完整的 IISreset。
在故障转储分析中,我发现一条异常消息指出:异常代码:0xC0000005 异常信息:线程尝试读取或写入它没有适当访问权限的虚拟地址。
希望有人能给我更多关于这个例外的信息吗?