2

これを手伝ってくれる SO の SharePoint 専門家がここにいることを願っています。

これが問題です。私の SharePoint ログには、次の行が数回含まれています。

An SPRequest object was not disposed before the end of this thread. To avoid wasting system resources, dispose of this object or its parent (such as an SPSite or SPWeb) as soon as you are done using it. This object will now be disposed. Allocation Id: {8D090AD2-5D55-42C2-9873-2D5486FE257C} To determine where this object was allocated, create a registry key at HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Shared Tools\Web Server Extensions\HeapSettings. Then create a new DWORD named SPRequestStackTrace with the value 1 under this key.

レジストリを編集してキーを追加しましたが、スタックトレースがどこにも見つかりません。SharePoint ログやイベント ビューアーにはありません。

これらの SPSite/SPWeb リークの原因を突き止めて修正する必要がありますが、問題の原因であるかどうかに関係なくコードの編集を開始することはできません。誰か提案はありますか?

4

4 に答える 4

2

廃棄に関する注意事項を確認するのに最適な場所は次のとおりです。

http://blogs.msdn.com/rogerla/archive/2008/02/12/sharepoint-2007-and-wss-3-0-dispose-patterns-by-example.aspx

あなたの場合、OpenWeb() は using でラップする必要があります。fianlly ブロックでそれを破棄している場合は、他の「落とし穴」インスタンスを呼び出しているかどうかを確認するために、より多くのコードを表示することをお勧めします。また、SPContext クラスから取得した特定の SPSite および SPWeb オブジェクトを破棄する必要はありません。

オブジェクトの廃棄を追跡したい場合は、それらを継承し、onload および ondispose メソッドをオーバーライドして、詳細なメッセージ方法でログに記録できます。

コードを読むと、SPWeb オブジェクトが RunWithElevatedPriviledges デリゲートの外部で宣言されていることがわかります。これは、SharePoint がそれらを破棄する方法に影響を与える可能性があります。通常、デリゲート内のオブジェクトに対して必要なことを行うことをお勧めします。

于 2008-10-20T16:04:50.527 に答える
1

レジストリの変更をキャッチするには、影響を受けるプロセスを再起動する必要があります(w3wp.exeの場合はIISを再起動します)。

于 2008-10-22T13:37:23.693 に答える
1

前述の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
        }
    });
}
于 2008-10-20T17:06:24.600 に答える
0

を読むことをお勧めします:

これらのアドバイスがどれもうまくいかない場合。WSS v3 および MOSS 2007 での SPSite/SPWeb リークのトラブルシューティングを参照してください。

編集: SPSite オブジェクトを破棄する必要があります。すべての SPWeb オブジェクトが自動的に破棄されるためです。

于 2008-10-20T14:30:14.057 に答える