16

ASP.NETMVCを使用するWebサイトを含むWindowsAzureWebロールがあります。HTTPリクエストが到着し、ページが最初に読み込まれると、ビュー(.aspxまたは.cshtml)がコンパイルされます。これには時間がかかるため、最初にページが提供されるときは、後で同じページを提供するよりもかなり時間がかかります。

ビューのコンパイル時検証を強制することを有効にしましたが(この回答で<MvcBuildViews>説明されています)、サイトがデプロイされて実行されているときは、コンパイルに影響がないようです。

Azure Webロールには、いわゆるスタートアップタスクと、OnStart()ウォーミングアップコードを配置できる特別な方法があるため、ロールにそれを追加する方法がわかれば問題ありません。

すべてのビューのコンパイルを強制する方法はありますか?

4

5 に答える 5

15

DavidEbboによるプリコンパイル済みRazorビューをご覧ください

なぜあなたはそれをしたいのですか?

これを行う理由の1つは、実行時にコンパイルするものが残っていないため、サイトの起動時に実行時のヒットを回避するためです。これは、多くのビューがあるサイトで重要になる可能性があります。

また、cshtmlファイルを展開する必要がなくなり、展開ファイルセットが小さくなります。

もう1つの優れた利点は、ビューを単体テストできることです。これは、標準のランタイムコンパイルモデルでは常に非常に困難でした。これについては、今後の投稿で詳しく説明します。

于 2012-05-16T12:41:33.347 に答える
8

ClientBuildManager.PrecompileApplicationを使用して実行でき、オンデマンドのコンパイル動作を模倣するASP.NET Precompilationがありますが、すべてのページをコンパイルするだけです。試してみました-最初のロードは著しく速く見えます。

重要な部分は、ClientBuildManagerコンストラクターパラメーターとして渡すものです。解決策は、すべて.ApplicationsSiteオブジェクトを列挙し、各項目についてすべてを.Applications列挙し、各項目からコンストラクターへのパラメーターとして使用することです。.VirtualDirectoriesPathVirtualPathClientBuildManager

于 2012-05-16T14:28:03.730 に答える
3

これは初期負荷の問題ですか、それとも定常状態の問題ですか?見られる問題の1つは、アプリプールのリサイクルの問題です。これはデフォルトで20分のタイムアウトになります。タイムアウトを無効にする(または何か大きなものに設定する)場合、それは有効な回避策ですか?

AppPoolタイムアウトとそれを無効にする方法について説明している別のSO回答があります。基本的に:

%windir%\system32\inetsrv\appcmd set config -section:applicationPools -applicationPoolDefaults.processModel.idleTimeout:00:00:00
于 2012-05-16T13:55:15.457 に答える
1

これをOnStartに追加します。

  using (var serverManager = new ServerManager())
        {
            string siteName = RoleEnvironment.CurrentRoleInstance.Id + "_" + "Web";
            var siteId = serverManager.Sites[siteName].Id;
            var appVirtualDir = $"/LM/W3SVC/{siteId}/ROOT";  // Do not end this with a trailing /

            var clientBuildManager = new ClientBuildManager(appVirtualDir, null, null,
                                        new ClientBuildManagerParameter
                                        {
                                            PrecompilationFlags = PrecompilationFlags.Default,
                                        });

            clientBuildManager.PrecompileApplication();
        }
于 2016-09-25T15:22:16.877 に答える
0

Visual Studioの発行機能を使用する場合は、はるかに簡単なオプションがあります。

[公開]ダイアログ> [設定]ペインで、[ファイルの公開オプション]を展開し、[公開中にプリコンパイル]をオンにして、[構成]をクリックします。[プリコンパイルの詳細設定]ダイアログボックスで、[プリコンパイルされたサイトの更新を許可する]チェック ボックスをオフにします。

ソース:https ://msdn.microsoft.com/en-us/library/hh475319.aspx

于 2017-05-04T14:55:48.953 に答える