2011-02-18 14 views
5

私は現在、同じコントローラも使用する複数の場所で同様のビューを管理する.net mvc3アプリケーションを持っています(site1/v1/views/index.cshtmlsite1/v2/views/index.cshtmlなど)。MVC Razor ViewEngineはスレッドセーフではありませんか?

この処理方法は、DefaultControllerFactoryおよびCreateControllerメソッドを継承するCustomControllerFactoryを作成して、既存のビューエンジンをクリアし、現在のURLに基​​づいてビューのロケーションフォーマットを指定する新しいカスタムviewEngineを追加することです。

site1.com/v1/index.cshtml上のユーザの土地ならば、viewengineはのビューの場所を指定します:

string versionDirectory = "v1"; 
ViewLocationFormats = new[]{ versionDirectory + "/Views/{0}.cshtml", 
          "/Views/{0}.cshtml", 
          "~/Shared/{0}.cshtml" 
          }; 

を私が午前問題は、複数のユーザーが、すべてのユーザーがほぼ同じ時間に別のページに着陸あればということです同じビューが表示されます。

Initially i thought this was related to cachingですが、usecache = falseをカスタムviewEngineに明示的に設定した後は、ViewEngines class not being thread safeともっと関係があるようです。

どのように私は同じ結果を達成することができますが、別の方法で誰もがアイデアを持っていますか?

ありがとうございます。

+0

どのようにしているのかわかりませんが、静的オブジェクトはすべてのリクエストで共有されています。これは問題に関連している可能性があります。 – Buildstarted

答えて

9

ViewEnginesコレクションは静的コレクションであるため、その値は要求全体で共有されます。あなたがしようとしていることは可能ですが、あなたがやっていることは正しいことではありません。

簡単なアプローチの1つは、RazorViewEngineから派生し、FindViewメソッドをオーバーライドするカスタムビューエンジンを作成することです。このメソッドはリクエストごとに1回呼び出されます。実装では、base.FindViewを呼び出して、必要なサイト情報が含まれるように結果を変更します(nullでない場合)。

Scott Hanselmanには、カスタムビューエンジンを介して別の場所でビューを探すという例を示すブログ記事があります。 http://www.hanselman.com/blog/ABetterASPNETMVCMobileDeviceCapabilitiesViewEngine.aspx

+0

ありがとうございます!これは正常に動作します – kfegen

+0

この投稿のソースには大きなバグがあります。ビューエンジンのアップデート版はhttps://bitbucket.org/shanselman/mobileviewengines/src/48310997a453/Helpers/MobileCapableRazorViewEngine.csにあります。オリジナルの投稿と私が提供した新しいリンクは、私が間違って考えたHTTP要求スコープとは対照的に、静的であることを理解していないbase.ViewLocationFormatsコレクションを変更するための私の貧しい選択を解決する鍵でした。 –

1

組み込みビューエンジンはスレッドセーフです。あなたの問題は、キャッシュまたはカスタムビューエンジンです。他の回答のリンクのコメントを確認してください。