Web パーツのエラーでページが表示できない場合のトラブルシューティング


アップデート : 2013 11 12
 
対象製品:
SharePoint Server 2010
SharePoint Server 2013
 
こんにちは。SharePoint サポートチームの多田 信吾です。
リストやドキュメントライブラリのアイテム表示ページ (: AllItems.aspx) は、SharePoint Designer XSLT の記述形式を使用し、自由にデザインをカスタマイズすることが可能です。また、アイテムを表示するためのリスト ビュー Web パーツについても同様に XSLT の記述形式を使用してデザインのカスタマイズを行うことが可能になります。
XSLT 形式でカスタマイズしているページや Web パーツを表示した際に、稀に以下のエラーメッセージが表示される場合があります。以下のエラーメッセージは様々な要因で発生いたします。今回は以下のエラーメッセージが発生した際のトラブルシューティングについてご紹介いたします。
 
エラーメッセージ
^^^^^^^^^^^
  
 
この Web パーツを表示できません。この問題のトラブルシューティングを行うには、Microsoft SharePoint Foundation と互換性のある Microsoft SharePoint Designer などの HTML エディターでこの Web ページを開いてください。問題が解決しない場合は、Web サーバーの管理者に問い合わせてください。
 
要因 1. XSLT の記述内容に誤りがある
======================
XSLT 編集時にタグの閉じ忘れ等、不正な文字列を入れた際に発生する場合があります。この場合、一度上記のエラーメッセージが発生すると、ページ表示時に毎回発生する動作になり、iisreset を実施しても現象が回避しません。
 
対処策
^^^^^
XSLT を正しく編集し直すことで現象を回避できます。ページのバージョン管理をしている場合は、バージョンをもとに戻すことでも現象を回避することが可能です。
 
要因 2. XSLT のレンダリング時にタイムアウトが発生している
====================================
XSLT のレンダリング時にタイムアウトが発生した場合でもこのエラーメッセージが表示されます。この場合、稀にエラーメッセージが表示されたり、iisreset やアプリケーションプールのリサイクルの直後にアクセスした場合のみ発生したりします。
XSLT のレンダリング時のタイムアウトが発生した場合は、診断ログに以下の System.StackOverflowException を示すエラーメッセージが記録されます。
 
--- 診断ログ ---
xx/xx/2013 xx:xx:xx.xx         w3wp.exe (0xXXXX)                                     0xXXXX    SharePoint Foundation                       Web Parts                       89a1       High      
Error while executing web part: System.StackOverflowException: この操作によってスタック オーバーフローが発生しました。    
場所 Microsoft.Xslt.NativeMethod.CheckForSufficientStack()    
場所 <xsl:template name="FieldHeader._xXXXX__xXXXX__xXXXX__xXXXX_">(XmlQueryRuntime , XPathNavigator , XPathNavigator , XPathNavigator , XPathNavigator , XPathNavigator , XPathNavigator )    
場所 <xsl:template name="headerFieldRow._xXXXX__xXXXX__xXXXX__xXXXX_">(XmlQueryRuntime , XPathNavigator , Double , XPathNavigator , XPathNavigator , XPathNavigator , XPathNavigator )    
場所 <xsl:template name="dvt_headerfield._xXXXX__xXXXX__xXXXX__xXXXX_">(XmlQueryRuntime , XPathNavigator , Double , XPathNavigator , XPathNavigator , XPathNavigator , XPathNavigator )    
場所 <xsl:template match="FieldRef[@Name='_xXXXX__xXXXX__xXXXX__xXXXX_']" name="FieldRef_header._xXXXX__xXXXX__xXXXX__xXXXX_" mode="header">(XmlQueryRuntime , XPathNavigator , Double )    
場所 <xsl:template match="View" mode="full">(XmlQueryRuntime , XPathNavigator , String )    
場所 <xsl:template match="View" name="View_Default_RootTemplate" mode="RootTemplate">(XmlQueryRuntime , XPathNavigator , String )    
場所 <xsl:template match="/">(XmlQueryRuntime )    
場所 Root(XmlQueryRuntime )    
場所 System.Xml.Xsl.XmlILCommand.Execute(Object defaultDocument, XmlResolver dataSources, XsltArgumentList argumentList, XmlWriter writer, Boolean closeWriter)    
場所 System.Xml.Xsl.XmlILCommand.Execute(IXPathNavigable contextDocument, XmlResolver dataSources, XsltArgumentList argumentList, XmlWriter results)    
場所 System.Xml.Xsl.XslCompiledTransform.Transform(IXPathNavigable input, XsltArgumentList arguments, XmlWriter results)    
場所 Microsoft.SharePoint.WebPartPages.DataFormWebPart.ExecuteTransform(XslCompiledTransform xslCompiledTransform, XsltArgumentList xmlArguments, Boolean bDeferExecuteTransform)    
場所 Microsoft.SharePoint.WebPartPages.DataFormWebPart.PrepareAndPerformTransform(Boolean bDeferExecuteTransform)
------------------
 
対処策
^^^^^
以下の手順にて XSLT のレンダリング時のタイムアウト値を延ばします。
 
1. SharePoint サーバーに管理者権限でログインします。
2. [スタート] - [すべてのプログラム] - [Microsoft SharePoint 2010 Products] - [SharePoint 2010 管理シェル] を右クリックし、[管理者として実行] をクリックします。
3. 以下のコードを実行します。
 
$farm=Get-SPFarm
$farm.XsltTransformTimeOut = 2
$farm.Update()
 
1. 上記の例では xslt の処理のタイムアウト値を 2 秒に変更しております。
2. 既定は 1 秒になります。(SharePoint 2010 SP2 時点、SharePoint 2013 RTM 時点)
3. 上記の設定は SharePoint ファーム全体で有効になります。
 
注意事項 :
タイムアウト値を長くするとレンダリング処理時間が長くなった場合にスタック領域を溢れてワーカープロセスが強制終了する危険性があります。このため、可能な限り低い値に設定いただくことを推奨します。
 
要因 3. .NET Framework による問題
========================
.NET Framework 側の問題により、ページ表示時に稀に上記のエラーメッセージが表示される場合があります。この問題が発生した場合、診断ログに以下のエラーメッセージが記録されます。
 
--- 診断ログ ---
Web パーツの実行中のエラー: System.NullReferenceException: オブジェクト参照がオブジェクトのインスタンスに設定されていません。
at System.Xml.Xsl.XslCompiledTransform.Load(MethodInfo executeMethod, Byte[] queryData, Type[] earlyBoundTypes)
at Microsoft.Xslt.STransform.GetCompiledTransform()
at Microsoft.SharePoint.WebPartPages.BaseXsltListWebPart.LoadXslCompiledTransform(WSSXmlUrlResolver someXmlResolver)
at Microsoft.SharePoint.WebPartPages.DataFormWebPart.GetXslCompiledTransform()
at Microsoft.SharePoint.WebPartPages.DataFormWebPart.PrepareAndPerformTransform(Boolean bDeferExecuteTransform)
----------------
 
- 参考情報
Microsoft SharePoint アプリケーションで、Web パーツの実行中にエラーが発生することがある
http://support.microsoft.com/kb/2872441
 
※ 本現象は .NET Framework 3.5.1 に関する問題であるため、SharePoint 2010 のみに該当します。
 
対処策
^^^^
以下のセキュリティ更新プログラムを適用することで回避可能です。
 
[MS13-052] Windows 7 Service Pack 1 および Windows Server 2008 R2 Service Pack 1 用の .NET Framework 3.5.1 のセキュリティ更新プログラムについて (2013 7 9 )
http://support.microsoft.com/kb/2844286/ja
 
要因 4. XSLT の初回レンダリング時にコンパイルが失敗する
==================================
XSLT iisreset やアプリケーションプールのリサイクルの直後にアクセスした際にコンパイルされ、Web フロントエンドサーバーのワーカープロセスのメモリ空間にロードされます。この際、メモリに格納されたオブジェクト状態の整合性に問題が生じるなどの要因で、レンダリングに失敗し、上記のエラーメッセージが表示される場合があります。この場合、一度本エラーメッセージが発生すると、次回 iisreset またはアプリケーションプールのリサイクルまでエラーが解消されません。
診断ログには様々な種類のエラーメッセージが記録されますが、すべてのエラーメッセージのスタックトレースの中に CreateDynamicMethods メソッドが含まれます。診断ログの例を本ブログの最後に記載いたします。
 
対処策
^^^^^
恒久的な対処としては、毎日深夜に実施されるアプリケーションプールの自動リサイクル後に、サイトにアクセスし、あらかじめ XSLT のレンダリングに関わる DLL をワーカープロセスのメモリ空間にロードしておくことで現象を回避できます。
この場合、サイトにアクセスするためのウォームアップスクリプトを作成し、Windows のタスク スケジューラ等を使用し、アプリケーションプールの自動リサイクル後に実行されるようセットします。
 
この現象は内部的に以下の処理の流れで発生していると想定しております。
・初回アクセス => XSL トランスフォーム => DLL ロード および JIT コンパイル => エラー => 次回アクセス時もエラー
 
サイトにアクセスする際の URL XSLT を使用しているページに直接アクセスすると上記の同様の流れでエラーが発生する可能性があるため、XSLT が使用されていないページに対してアクセスするウォームアップスクリプトを作成することを推奨します。XSLT が使用されていないページにアクセスし、必要な DLL のロードおよび JIT コンパイルを行うことで、次回以降 XSLT が使用されているページにアクセスした際に XSLT のトランスフォームのみが実行されるようにします。
初回アクセス => DLL ロード および JIT コンパイル
・次回アクセス => XSL トランスフォーム => DLL 参照 => 正常動作
 
方法) PowerShell を使用したウォームアップ スクリプト
以下にウォームアップスクリプトの一例をご紹介します。以下は PowerShell のコマンドで SharePoint サイトにアクセスしウォームアップを行っております。
 
--- ウォームアップスクリプトのサンプル ---
$webclient = new-object System.Net.WebClient
$webclient.UseDefaultCredentials = $true
$webpage = $webclient.DownloadString($url)
-------------------------------------------------
 
--- 要因 4. が発生した際に記録される診断ログの例 ---
xx/xx/2013 xx:xx:xx.xx         w3wp.exe (0xXXXX)                                     0xXXXX    SharePoint Foundation                       Web Parts                       89a1       High      
Error while executing web part: System.ArgumentOutOfRangeException: インデックスが範囲を超えています。負でない値で、コレクションのサイズよりも小さくなければなりません。  パラメータ名: index    
場所 System.ThrowHelper.ThrowArgumentOutOfRangeException()    
場所 System.Collections.Generic.List`1.get_Item(Int32 index)    
場所 Microsoft.Xslt.MethodCollection.CreateDynamicMethods()     
場所 Microsoft.Xslt.MethodCollection.GetMethodInfoInternal(Int32 methodNumber)    
場所 Microsoft.Xslt.MethodCollection.GetMethodInfo(Int32 methodNumber)    
場所 Microsoft.Xslt.STransform.GetCompiledTransform()    
場所 Microsoft.SharePoint.WebPartPages.BaseXsltListWebPart.LoadXslCompiledTransform(WSSXmlUrlResolver someXmlResolver)    
場所 Microsoft.SharePoint.WebPartPages.DataFormWebPart.GetXslCompiledTransform()    
場所 Microsoft.SharePoint.WebPartPages.DataFormWebPart.PrepareAndPerformTransform(Boolean bDeferExecuteTransform)
 
xx/xx/2013 xx:xx:xx.xx         w3wp.exe (0xXXXX)                                     0xXXXX    SharePoint Foundation                       Web Parts                       89a1       High      
Error while executing web part: System.ArgumentException: 同一のキーを含む項目が既に追加されています。    
場所 System.ThrowHelper.ThrowArgumentException(ExceptionResource resource)    
場所 System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add)    
場所 System.Collections.Generic.Dictionary`2.Add(TKey key, TValue value)    
場所 Microsoft.Xslt.MethodCollection.CreateMethodDescriptions()    
場所 Microsoft.Xslt.MethodCollection.CreateDynamicMethods()     
場所 Microsoft.Xslt.MethodCollection.GetMethodInfoInternal(Int32 methodNumber)    
場所 Microsoft.Xslt.MethodCollection.GetMethodInfo(Int32 methodNumber)    
場所 Microsoft.Xslt.STransform.GetCompiledTransform()     
場所 Microsoft.SharePoint.WebPartPages.BaseXsltListWebPart.LoadXslCompiledTransform(WSSXmlUrlResolver someXmlResolver)    
場所 MicrosoftSharePoint.WebPartPages.DataFormWebPart.GetXslCompiledTransform()    
場所 Microsoft.SharePoint.WebPartPages.DataFormWebPart.PrepareAndPerformTransform(Boolean bDeferExecuteTransform)
 
xx/xx/2013 xx:xx:xx.xx         w3wp.exe (0xXXXX)                                     0xXXXX    SharePoint Foundation                       Web Parts                       89a1       High      
Error while executing web part: System.IndexOutOfRangeException: インデックスが配列の境界外です。    
場所 Microsoft.Xslt.MethodCollection.ResolveMethodDef(Int32 tokenNum)    
場所 Microsoft.Xslt.MethodCollection.ResolveToken(Int32 token)    
場所 Microsoft.Xslt.MethodCollection.MethodDescription.SetCode(DynamicILInfo ilInfo, Int32[] fixup, Byte[] ilCode, Byte[] ehTable, Int32 maxStackSize, MethodCollection methodColl)    
場所 Microsoft.Xslt.MethodCollection.MethodDescription.DefineDynamicMethod(DynamicMethod dm, MethodCollection methodColl)    
場所 Microsoft.Xslt.MethodCollection.CreateDynamicMethods()     
場所 Microsoft.Xslt.MethodCollection.ResolveMethodDef(Int32 tokenNum)    
場所 Microsoft.Xslt.MethodCollection.ResolveToken(Int32 token)    
場所 Microsoft.Xslt.MethodCollection.MethodDescription.SetCode(DynamicILInfo ilInfo, Int32[] fixup, Byte[] ilCode, Byte[] ehTable, Int32 maxStackSize, MethodCollection methodColl)    
場所 Microsoft.Xslt.MethodCollection.MethodDescription.DefineDynamicMethod(DynamicMethod dm, MethodCollection methodColl)    
場所 Microsoft.Xslt.MethodCollection.CreateDynamicMethods()    
場所 Microsoft.Xslt.MethodCollection.GetMethodInfoInternal(Int32 methodNumber)    
場所 Microsoft.Xslt.MethodCollection.GetMethodInfo(Int32 methodNumber)    
場所 Microsoft.Xslt.STransform.GetCompiledTransform()    
場所 Microsoft.SharePoint.WebPartPages.BaseXsltListWebPart.LoadXslCompiledTransform(WSSXmlUrlResolver someXmlResolver)    
場所 Microsoft.SharePoint.WebPartPages.DataFormWebPart.GetXslCompiledTransform()    
場所 Microsoft.SharePoint.WebPartPages.DataFormWebPart.PrepareAndPerformTransform(Boolean bDeferExecuteTransform)
 
xx/xx/2013 xx:xx:xx.xx         w3wp.exe (0xXXXX)                                     0xXXXX    SharePoint Foundation                       Web Parts                       89a1       High      
Error while executing web part: System.ArgumentException: シグネチャ型配列に無効な型が含まれています (: nullvoid)    
場所 System.Reflection.Emit.DynamicMethod.Init(String name, MethodAttributes attributes, CallingConventions callingConvention, Type returnType, Type[] signature, Type owner, Module m, Boolean skipVisibility, Boolean transparentMethod)    
場所 System.Reflection.Emit.DynamicMethod..ctor(String name, Type returnType, Type[] parameterTypes, Type owner, Boolean skipVisibility)    
場所 Microsoft.Xslt.MethodCollection.MethodDescription.DeclareDynamicMethod(MethodCollection methodColl)    
場所 Microsoft.Xslt.MethodCollection.CreateDynamicMethods()    
場所 Microsoft.Xslt.MethodCollection.GetMethodInfoInternal(Int32 methodNumber)    
場所 Microsoft.Xslt.MethodCollection.GetMethodInfo(Int32 methodNumber)    
場所 Microsoft.Xslt.STransform.GetCompiledTransform()    
場所 Microsoft.SharePoint.WebPartPages.BaseXsltListWebPart.LoadXslCompiledTransform(WSSXmlUrlResolver someXmlResolver)    
場所 Microsoft.SharePoint.WebPartPages.DataFormWebPart.GetXslCompiledTransform()    
場所 Microsoft.SharePoint.WebPartPages.DataFormWebPart.PrepareAndPerformTransform(Boolean bDeferExecuteTransform) 0b39844a-4f10-42ee-9bde-cc87dc91522a
------------------------------------------------------
 
要因 5. リストの列が 67 ~ 70 列を超えている
====================================
以下の記事参照。
 
Comments (0)

Skip to main content