5

SharePoint 2010 プロジェクトでは、Linq to SharePoint を使用して ConfigurationItems のリストを取得しています。私たちのテスト環境では、このリストからデータを取得する際に問題は発生しませんでした。私たちの実稼働環境では、リスト内のアイテムをループするときに null 参照例外が発生することがあります (現在はパターンを見つけることができません)。

以下は、Linq to SharePoint コードからスローされる例外です。

オブジェクト参照がオブジェクト インスタンスに設定されていません。スタックトレース:
Microsoft.SharePoint.Linq.FieldRef.GetHashCode() で
Microsoft.SharePoint.Linq.FieldRef.FieldRefEqualityComparer.GetHashCode (FieldRef obj) で
System.Linq.Set`1.InternalGetHashCode(TElement 値) で System.Linq.Set`1.Find(TElement 値、ブール加算) で 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 (式 e、コンテキスト 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 (文字列 siteUrl) InnerException で:

ソース: 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()
    };
}

これを追跡して、この例外の原因を突き止める方法についてアイデアを持っている人はいますか?

2011 年 5 月 31 日更新:

実稼働環境でこの動作を再現できるパターンを見つけました。また、テスト環境でもこの問題が発生し、AdPlus を使用していくつかのクラッシュ ダンプ ファイルを抽出しました。

この動作は、アプリケーション プールがリサイクルされた後に発生します。このエラーを修正する唯一の方法は、完全な IIS リセットを実行することです。

クラッシュダンプ分析で、次のような例外メッセージを見つけました: 例外コード: 0xC0000005 例外情報: スレッドは、適切なアクセス権がない仮想アドレスから読み書きしようとしています。

誰かがこの例外についてもう少し情報を提供してくれることを願っていますか?

4

3 に答える 3

2

残念ながら、この問題の解決策が見つからなかったため、LINQ から SharePoint に移行することにしました。いくつかのリストについては SQL テーブル (Linq to SQL) に変更し、SharePoint リストについては CAML に戻しました。

于 2012-01-02T13:59:34.530 に答える
0

私たちは同じことに出くわしました。次の手順で解決しました。

  • 問題の原因となっているサーバー上のSPMetalを介したdataContextクラスの再生成
  • クラスをプロジェクトに再適用し、再構築します
  • ソリューションを再デプロイします(DLLをGACにコピーしました)
于 2011-05-25T05:07:09.743 に答える