質問
私はようなものを使用しました
using (SPWeb web = SPControl.GetContextWeb(Context))
しかし、プロジェクトの展開中にエラーが表示されます。原因を見つけようとしている間、私はMSDNの記事に出会いました:
これはこれを述べています:
SPWEBクラスの廃棄または閉じる方法を使用して、getContextWebメソッドを介して返されたオブジェクトを閉じないでください。代わりに、Windows SharePointサービスまたはポータルアプリケーションにオブジェクトを管理させます。
私はSharePointが初めてですが、誰かがこの背後にある理由を説明できますか?
解決
コンテキストからspwebを取得した場合、それは他の場所で作成されており、他の場所でそれを破壊します。
ページがそれを処分するようになると、早期に破壊する(処分)すると、パニックに陥り、ページを生成するために使用される一部のデータはおそらく失われます。
経験則 - spsite.openweb()を使用する場合、または新しいspweb()を使用する場合、自分でそれを処分する必要があります(または使用したステートメントに含める)。これは、spwebCollection(spweb.webs、spsite.allwebs、またはspweb.getSubwebsforcurrentuser())を介して取得されたWebに等しく適用されます。
他のヒント
Dispose()
メソッドの場合 IDisposal
インターフェイスは、オブジェクトが重くて高価なリソースをロックするときに使用される特定のインターフェイスです。たとえば、データベースへの接続を取得する場合。処分方法は、私が接続(SQLの場合)で完了し、これを閉じて他の誰かにリソースを使用できるようにすることをオブジェクトに伝えるためにあります。 .NETでは、すべてが管理されたコードで記述され、自動的にゴミが収集されますが、SQL接続とcom+オブジェクトは自動的にリリースされません。
SharePointの場合、オブジェクトをいつ、どのように処分するかについて議論されてきました(何年もの間)。ジェームズは経験則でそれをよく説明します。場合によっては廃棄を呼び出す必要がある理由は、SharePointが非管理コード(com+)を使用しているためです SPSite
と SPWeb
たとえば、データベース呼び出しを行うオブジェクト。オブジェクトが適切に配置されていない場合、.NETのガベージコレクターは「外部」(.NET)オブジェクトを自動的にリリースできないため、最終的にメモリが外れます。
あなたの場合、あなたはすべきです いいえ 使用 using
声明はオブジェクトを自動的に処分するためです。使用ステートメントは、コンパイラでこのように展開されます。
using (SPWeb web = SPControl.GetContextWeb(Context)) {
...
}
これに:
try (SPWeb web = SPControl.GetContextWeb(Context)) {
...
}
finally {
web.Dispose();
}
私はSharePointの開発にもスピードを上げていますが、見つかりました 例でパターンを処分します この主題についての素晴らしい参照になること。これが私を助けてくれるのと同じくらいあなたに役立つことを願っています。
あなたが処分を正しく処理しているかどうかについて疑問を持っているなら、マイクロソフトは spdisposecheckツール あなたのためにそれをチェックすることができます。これをVisual Studioから直接手動で実行するか、ビルドサーバーの検証に組み込むこともできます。