13

最初のヒットを速くするために、インプレースコンパイルを使用したいWebサイトに取り組んでいます。を使用したいのですがClientBuildManagerCompileFileインプレースコンパイルを実行して、コンパイルプロセスを制御できるようにする方法。さまざまな理由から、これはこのWebサイトをコンパイルするための理想的な方法です。

IISが「一時ASP.NETファイル」の下の別のサブディレクトリにビルドされるのはなぜですか?

を介してファイルごとにWebサイトをコンパイルする場合ClientBuildManagerCompileFileこの目的のために構築されたexeのメソッドでは、出力は「TemporaryASP.NETFiles」の下のサブディレクトリに移動します。ただし、後でWebサイトにアクセスすると、IISは「TemporaryASP.NET Files」の下の別のサブディレクトリにあるコントロールを再構築し、以前のインプレースコンパイルを無価値にします。

:「一時ASP.NETファイル」でインプレースコンパイル中に作成されたアセンブリはそのまま残されます(まだ存在します)。

:インプレースコンパイルアセンブリフォルダーとIISで生成されたアセンブリフォルダーはどちらも、同じ「TemporaryASP.NETFiles」ディレクトリの下にあります。

例:

  • C:\ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ Temporary ASP.NET Files \ root \ 2ba591b9\[インプレースコンパイルフォルダー名]
  • C:\ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ Temporary ASP.NET Files \ root \ 2ba591b9\[ IISで生成されたWebサイト用のアセンブリ]\

ClientBuildManagerCompileFile構成

var buildParameter = new ClientBuildManagerParameter
   {
      PrecompilationFlags = PrecompilationFlags.Default,
   };
var clientBuildManager = new ClientBuildManager(
   RootVirtualPath, RootPhysicalPath, null, buildParameter);
...
clientBuildManager.CompileFile(relativeVirtualPath, callback);

デフォルトのWebサイトの場合RootVirtualPathは単に「」です。 RootPhysicalPathWebサイトのディスク上の場所を指します。 relativeVirtualPath"〜/myFile.aspx"の形式です。コールバックは、進行状況を追跡するために使用されます。

4

2 に答える 2

12

あなたが見ているものは、実際にはCompileFilevsの使用とは無関係だと思いますPrecompileApplication。つまり、同じことを実行してからを呼び出しPrecompileApplication()た場合でも、フォルダの不一致が発生します。

技術的には、CBMオブジェクトを正しく作成していないことに注意してください。それを呼び出す正しい方法は、IIS情報に依存してファイルを見つけることです。これをする:

  • /LM/W3SVC/7/ROOT/のようなものを渡すappVirtualDir
  • nullを渡すappPhysicalSourceDir

「7」は単なる例であることに注意してください。正しい番号を取得するには:

  • inetmgrを実行します
  • サイトの詳細設定に移動します
  • サイトIDを見つけます。それはあなたが望む数です/LM/W3SVC/ID/ROOT/

残念ながら、この方法でもフォルダを一致させることができなかったため、これを記録のために説明しています。このシナリオはASP.NETで壊れている可能性があります(以前は機能していました!)。

別の可能性は、サーバー側でそれを行うことです。例えば

  • 選択的な事前コンパイルをトリガーするために使用するページをサイトに含めます。
  • そこで、を呼び出しBuildManager.GetCompiledType("~/myfile.aspx")、プリコンパイルする各ページ(またはユーザーコントロールなど)に対して同様の呼び出しを行います。
  • カスタムプリコンパイルをトリガーする場合は、そのページをリクエストするだけです

もちろん、サイトをウォームアップするために、コンパイルしたいページを事前に要求するだけのローテクな代替手段もあります。

于 2013-03-12T00:57:46.057 に答える
3

サム、答えはデビッド・エボの答えとあなたの元のコードの間のクロスです。

var buildParameter = new ClientBuildManagerParameter
   {
      PrecompilationFlags = PrecompilationFlags.Default,
   };
var clientBuildManager = new ClientBuildManager(
   RootVirtualPath, RootPhysicalPath, null, buildParameter);
...
clientBuildManager.CompileFile(relativeVirtualPath, callback);

David Ebboが言ったことを実行し、ClientBuildManagerを構築するときにRootVirtualPathにこれを使用する場合:

/LM/W3SVC/7/ROOT/

次に、RootPhysicalPathにnullを渡す必要があります。

これで残りの問題が解消され、IISが探しているのと同じディレクトリにビルドされるはずです。

于 2013-03-20T16:42:21.523 に答える