В нашем проекте SharePoint 2010 мы используем Linq to SharePoint, чтобы получить список ConfigurationItems.В наших средах тестирования у нас никогда не было проблем с получением данных из этого списка.В нашей производственной среде мы теперь иногда (не можем найти шаблон прямо сейчас) получим исключение нулевой ссылки при циклическом просмотре элементов в списке.
Ниже приведено исключение при переходе из Linq в SharePointcode:
Object reference not set to an instance of an object. StackTrace:
at Microsoft.SharePoint.Linq.FieldRef.GetHashCode()
at Microsoft.SharePoint.Linq.FieldRef.FieldRefEqualityComparer.GetHashCode(FieldRef obj)
at 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()
at System.Linq.Buffer`1..ctor(IEnumerable`1 source) at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source) at Microsoft.SharePoint.Linq.SelectMappingInfo.GetDistinctMappedFields()
at Microsoft.SharePoint.Linq.Rules.PushDownProcessor.SelectWithInfoOp.PushDownSelect(Context ctx)
at Microsoft.SharePoint.Linq.Rules.PushDownProcessor.SelectWithInfoOp.Process(Context ctx)
at Microsoft.SharePoint.Linq.Rules.GuardedRule`4.c__DisplayClass7.b__6(TSourceBase src, TContext ctx)
at Microsoft.SharePoint.Linq.Rules.RewriteRule`2.Apply(TNode src, TContext ctx) at Microsoft.SharePoint.Linq.Rules.CacheRule`3.Apply(TSource src, TContext ctx)
at Microsoft.SharePoint.Linq.Rules.PushDownProcessor.b__0(Expression e, Context ctx)
at Microsoft.SharePoint.Linq.Rules.ChildRule`2.Apply(TNode src, TContext ctx) at Microsoft.SharePoint.Linq.Rules.PushDownProcessor.b__3(Expression e, Context ctx)
at Microsoft.SharePoint.Linq.Rules.RewriteRule`2.Apply(TNode src, TContext ctx) at Microsoft.SharePoint.Linq.Rules.CacheRule`3.Apply(TSource src, TContext ctx)
at Microsoft.SharePoint.Linq.SPLinqProvider.Rewrite(Expression expression, List`1& assumptions)
at Microsoft.SharePoint.Linq.SPLinqProvider.RewriteAndCompile[T](Expression expression, List`1& assumptions)
at Microsoft.SharePoint.Linq.LinqQuery`1.GetEnumerator()
at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
at Common.Configuration.ConfigurationRepository.GetConfiguration(String siteUrl) InnerException:
Source: Microsoft.SharePoint.Linq TargetSite: 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()
};
}
У кого-нибудь есть идеи о том, как отследить это и объяснить причину этого исключения?
ОБНОВЛЕНИЕ 31-05-2011:
Мынашел образец, каким образом мы можем воспроизвести это поведение в нашей производственной среде.А также в нашей тестовой среде у нас тоже была эта проблема, из которой мы извлекли некоторые файлы Crash Dump с помощью AdPlus.
Мы видим, что такое поведение происходит после перезапуска пула приложений.Единственный способ исправить эту ошибку - выполнить полный сброс IIS.
В анализе сбоев я обнаружил сообщение об исключении, которое гласит: Код исключения: 0xC0000005 Информация об исключении: Поток пытается прочитать или записать виртуальный адрес, для которого у него нет соответствующего доступа.
Надеюсь, что кто-нибудь может дать мне больше информации об этом исключении?