4

RazorViewEngine から派生したカスタム カミソリ エンジンで、不安定なコードと思われるものを見つけました。

    public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache)
    {
        ViewLocationFormats = AddViewDynamicFormat(controllerContext, viewName).ToArray();
        AreaViewLocationFormats = AddAreaViewDynamicFormat(controllerContext, viewName).ToArray();
        return base.FindView(controllerContext, viewName, masterName, useCache);
    }

私の懸念は、2 つのリクエストが「同時に」処理されている場合、最初のリクエストは必要に応じて場所の形式を設定しますが、それらを使用する前に、2 番目のスレッド化されたリクエストが場所の形式を別の形式に設定する可能性があることです。仕方。残りは醜くなります。

これは正当な懸念事項ですか?別の言い方をすれば、ASP.NET MVC は、Razor View エンジンが一度に 1 つの要求を処理することを保証しますか? 私はそうではないかと疑っています。

同様に、リクエストごとに 1 つの razor ビュー エンジンオブジェクトがあれば、これで問題ありません。しかし、私もそうではないと思います。

更新 これが競合状態であることを確認しました。また、競合状態なしで問題を解決する動的な拡張カミソリ検索の例を示す記事も見つけました(ただし、キャッシュの問題があるかどうかはまだ疑問です)。

4

2 に答える 2

0

仮想ですかViewLocationFormatsAreaViewLocationFormatsその場合、その値をコレクションに入れHttpContext.Current.Items、オーバーライドされたプロパティから取得できます。

于 2012-06-04T21:33:19.373 に答える
0

私は、RazorViewEngine が実行時に変更されることを意図しておらず、Global.asax Application_Start で構成されているだけであることをほぼ確信しています。RazorViewEngine インスタンスは、起動後のアプリ ドメインの存続​​期間中存在すると思います。

追加の ViewLocationFormats または AreaViewLocationFormats を追加する必要がある場合は、Application_Start で行います。Application_Start は、アプリ ドメインごとに 1 回だけ実行されることが保証されています。

于 2012-06-04T21:46:05.390 に答える