Linq to SharePoint выбрасывает исключение нулевой ссылки - PullRequest
5 голосов
/ 24 марта 2011

В нашем проекте 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 Информация об исключении: Поток пытается прочитать или записать виртуальный адрес, для которого у него нет соответствующего доступа.

Надеюсь, что кто-нибудь может дать мне больше информации об этом исключении?

Ответы [ 3 ]

2 голосов
/ 02 января 2012

К сожалению, мы не нашли решение этой проблемы и решили перейти от LINQ к SharePoint. Для нескольких списков мы изменили его на таблицы SQL (Linq to SQL), а для списков SharePoint мы вернулись к CAML.

1 голос
/ 31 марта 2014

В нашем проекте мы активно используем Linq для Sharepoint, и эта проблема периодически возникала, и только на производстве.Единственная вещь, которая, казалось, сработала, когда это произошло, это сброс IIS.

Мы углубились в проблему чуть глубже и до сих пор не знаем, что ее вызывает.Но мы обнаружили, что вы можете автоматически исправить это, когда произойдет очистка некоторых переменных личного кэша.Вот наш код:

public static class SharePointless
{
    public static void Reset()
    {
        var assembly = Assembly.GetAssembly(typeof(EntityList<>));
        var providerType = assembly.GetType("Microsoft.SharePoint.Linq.SPLinqProvider");
        var singleton = providerType.GetField("Singleton", BindingFlags.Static | BindingFlags.Public);
        if (singleton == null) throw new Exception("Expected field doesn't exist in SPLinqProvider");
        singleton.SetValue(null, Activator.CreateInstance(providerType));

        var itemMappingInfoType = assembly.GetType("Microsoft.SharePoint.Linq.SPItemMappingInfo");
        var cachedMappings = itemMappingInfoType.GetField("cachedMappings", BindingFlags.Static | BindingFlags.NonPublic);
        if (cachedMappings == null) throw new Exception("Expected field doesn't exist in SPItemMappingInfo");
        cachedMappings.SetValue(null, null);
    }
}

Пример использования:

public static void MyMethod(bool retry)
{
    try
    {
        using (var db = new MyDataContext())
        {
            DoStuff(db);
        }
    }
    catch (NullReferenceException ex)
    {
        if (retry && ex.StackTrace.Contains("FieldRef.GetHashCode"))
        {
            SharePointless.Reset();
            MyMethod(false);
        }
    }
}

В нашем случае мы также получили код пересылки, отправив нам электронное письмо, чтобы мы знали, что проблема возникла и исправление сработало.

0 голосов
/ 25 мая 2011

Мы столкнулись с тем же.Следующие шаги решили ее:

  • Восстановление класса dataContext через SPMetal на сервере, вызывающее проблему
  • Повторное применение класса к вашему проекту и перестройка
  • Повторное развертываниерешение (копирование DLL в GAC сработало)
...