カスタムMVCコントローラー ファクトリを特定の方法で使用した場合のメモリ リーク


解説

Sitecoreソリューションでカスタム MVC コントローラー ファクトリを特定の方法で使用すると、Webサイトが過度のメモリを使用する可能性があります。

この問題は、カスタムMVCコントローラーを使用するSitecore実装の詳細が原因で発生します。

この挙動の解決策と、挙動を引き起こす技術的詳細については、以下のセクションをご確認ください。

解決策

この問題を解決するには、次のパッチを適用します:

  1. Sitecore.Support.438688.dll アセンブリをソリューションの/binフォルダーにコピーします。
  2. Sitecore.Support.438688.config ファイルをソリューションの/App_config/Includeフォルダーにコピーします。

技術的詳細

この問題は通常、Webアプリケーションのメモリ ダンプファイルを確認し、カスタムMVCコントローラー ファクトリ オブジェクトによってルート化された複数の.NETオブジェクトGCを見つけることで特定できます。

Sitecoreは、Chain of Responsibilityパターンを使用して、さまざまなタイプのリクエストに対していくつかのタイプのコントローラー ファクトリを登録します。

カスタム コントローラ ファクトリが登録されると(例えば、アプリケーションの開始イベント)、処理順序の最後に配置されます:

SitecoreControllerFactory -> TagInjectionControllerFactory -> custom controller factory

コントローラの Execute() メソッドの呼び出しが完了すると、MvcHandler クラスの ProcessRequest() メソッドで ReleaseController() メソッドが呼び出されます。

SitecoreControllerFactoryは、内部ファクトリの ReleaseController() メソッドである TagInjectionControllerFactory を呼び出します。 
次に、TagInjectionControllerFactory はコントローラーの Dispose() メソッドを呼び出します。 ただし、カスタム コントローラ ファクトリの ReleaseController() メソッドは呼び出されません。

これにより、カスタム コントローラ ファクトリがまだコントローラ オブジェクトを追跡している状況でメモリ リークが発生します。

このような状況は、例えばLifecycledComponentsReleasePolicy を使用した Castle Windsor を使用してコントローラーを作成する場合に発生する可能性があります。