SharePointオブジェクトの適切な廃棄?
-
03-07-2019 - |
質問
これを支援できるSharePointエキスパートがSOにいることを願っています。
ここに問題があります。私のSharePointログには、この行が数回含まれています:
このスレッドの終了前にSPRequestオブジェクトが破棄されませんでした。システムリソースの浪費を避けるため、このオブジェクトまたはその親(SPSiteやSPWebなど)は、使い終わったらすぐに破棄してください。このオブジェクトは破棄されます。割り当てID:{8D090AD2-5D55-42C2-9873-2D5486FE257C}このオブジェクトが割り当てられた場所を確認するには、HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Shared Tools \ Web Server Extensions \ HeapSettingsにレジストリキーを作成します。次に、このキーの下に値1を持つSPRequestStackTraceという名前の新しいDWORDを作成します。
レジストリを編集してキーを追加しましたが、スタックトレースが見つかりません。 SharePointログまたはイベントビューアーにはありません。
これらのSPSite / SPWebリークの原因を見つけて修正する必要がありますが、問題の原因である場合とそうでない場合があるコードの編集を開始することはできません。誰か提案はありますか?
解決
レジストリの変更をキャッチするには、影響を受けるプロセスを再起動する必要があります(w3wp.exeの場合はIISを再起動します)。
他のヒント
廃棄に関する注意事項を確認するのに最適な場所は次のとおりです。
あなたの場合、OpenWeb()はusingでラップする必要があります。あなたのフィアンシャルブロックでそれを廃棄している場合、他の「忘れちゃった」を呼び出しているかどうかを確認するために、より多くのコードを表示することをお勧めします。インスタンス。また、SPContextクラスから取得された特定のSPSiteおよびSPWebオブジェクトを破棄する必要はありません。
オブジェクトの破棄を追跡する場合は、それらを継承し、onloadメソッドとondisposeメソッドをオーバーライドして、詳細なメッセージング方法でログに記録します。
コードを読むと、SPWebオブジェクトがRunWithElevatedPriviledgesデリゲートの外側で宣言されていることが示唆されます。これは、SharePointがそれらを処理する方法に影響を与える可能性があります。一般的に、デリゲート内のオブジェクトに対して必要なことを行うことをお勧めします。
http://msdn.microsoft.com/en-usから前述の/library/aa973248.aspx リンク:
Response.Redirectを呼び出しても、finallyブロックは実行されません。したがって、 処理のリダイレクトまたは転送が発生する前に、廃棄する必要があります オブジェクトの
サンプルコードを指定すると、Dispose()呼び出しがfinallyブロックにあるため、破棄されないオブジェクトを生成できます。
私の提案は、コードを次のように再構成することです。
try
{
//instantiate the SPSite and SPWeb with elevated privileges:
SPSecurity.RunWithElevatedPrivileges(delegate()
{
using (SPSite mySite = new SPSite(url))
{
using (myWeb = mySite.OpenWeb())
{
//do stuff here
}
}
});
}
Usingステートメントの複数のレイヤーがある場合、次のようにそれらを「スタック」して、コードがインデントされる量を減らすことができます(ifステートメントが次の行またはブロックを実行する方法と同様):
try
{
//instantiate the SPSite and SPWeb with elevated privileges:
SPSecurity.RunWithElevatedPrivileges(delegate()
{
using (SPSite mySite = new SPSite(url))
using (myWeb = mySite.OpenWeb())
{
//do stuff here
}
});
}
読んでおくことをお勧めします:
-
Chris O'Brien : SharePointオブジェクトの破棄-通知されないこと
これらのアドバイスがいずれも機能しない場合。 WSS v3およびMOSS 2007でのSPSite / SPWebリークのトラブルシューティング。
編集: SPSiteオブジェクトを破棄する必要があります。 すべてのSPWebオブジェクトを自動的に破棄するためです。