Compilation sur place à l’aide de ClientBuildManager.ComstackFile

Je travaille sur un site Web sur lequel j’aimerais utiliser la compilation sur place afin de rendre le premier coup plus rapide. J’aimerais utiliser ClientBuildManager . ComstackFile pour effectuer la compilation sur place afin que je ComstackFile contrôler le processus de compilation. Pour diverses raisons, c’est le moyen idéal pour comstackr ce site Web.

Pourquoi IIS crée-t-il dans un autre sous-répertoire sous “Fichiers ASP.NET temporaires”?

Lorsque je comstack un fichier de site Web par fichier via ClientBuildManager . Méthode ComstackFile dans un fichier exe créé à cet effet, la sortie est placée dans un sous-répertoire sous “Fichiers ASP.NET temporaires”. Toutefois, lorsque le site Web est visité ultérieurement, IIS reconstruit les contrôles dans un sous-répertoire différent sous “Fichiers ASP.NET temporaires”, ce qui rend la compilation in situ précédente inutile.

Remarque : les assemblys créés lors de la compilation sur place sous “Fichiers ASP.NET temporaires” sont laissés seuls (existent toujours).

Remarque : le dossier Assemblys sur place et le dossier Assemblages générés par IIS se trouvent dans le même répertoire “Temporary ASP.NET Files”.

Exemple:

  • C: \ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ Fichiers ASP.NET temporaires \ root \ 2ba591b9 \ [ nom du dossier de compilation sur place ]
  • C: \ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ Fichiers ASP.NET temporaires \ root \ 2ba591b9 \ [ Assemblages générés par IIS pour le site Web ] \

ClientBuildManager . ComstackFile Configuration

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

RootVirtualPath est simplement “” pour le site Web par défaut. RootPhysicalPath pointe vers l’emplacement sur le disque du site Web. relativeVirtualPath est de la forme “~ / myFile.aspx”. Le rappel est utilisé pour suivre les progrès.

Je pense que ce que vous voyez n’est en réalité pas lié à l’utilisation de ComstackFile vs ComstackFile . Par exemple, si vous deviez faire la même chose mais appeler PrecomstackApplication() , vous obtiendriez tout de même une incompatibilité de dossier.

Notez que techniquement, vous ne créez pas correctement l’object CBM. La façon correcte de l’appeler est de s’appuyer sur les informations IIS pour localiser les fichiers. Pour faire ça:

  • Passez quelque chose comme /LM/W3SVC/7/ROOT/ pour appVirtualDir
  • Pass null pour appPhysicalSourceDir

Notez que le ‘7’ est juste un exemple. Pour obtenir le bon numéro:

  • Exécuter inetmgr
  • Accédez aux parameters avancés du site.
  • Trouvez l’ID du site. C’est le nombre que vous voulez dans /LM/W3SVC/ID/ROOT/

J’explique cela pour le compte rendu, car malheureusement, je n’ai pas réussi à faire correspondre les dossiers, même de cette façon. Il est possible que ce scénario soit simplement rompu dans ASP.NET (cela fonctionnait auparavant!).

Une autre possibilité est de le faire côté serveur. par exemple

  • inclure une page dans votre site que vous utiliserez pour déclencher la précompilation sélective.
  • Dans cet exemple, appelez BuildManager.GetComstackdType("~/myfile.aspx") et des appels similaires pour chaque page (ou contrôle utilisateur, etc.) que vous souhaitez précomstackr.
  • Lorsque vous souhaitez déclencher votre précompilation personnalisée, il vous suffit de demander cette page.

Bien sûr, il existe également une alternative peu technique consistant à demander simplement les pages que vous souhaitez comstackr à l’avance pour mettre votre site en échauffement.

Sam, la réponse est un croisement entre la réponse de David Ebbo et votre code d’origine.

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

Si vous faites ce que David Ebbo a dit et utilisez ceci pour RootVirtualPath lors de la construction de ClientBuildManager:

/LM/W3SVC/7/ROOT/

vous devez ensuite transmettre null pour RootPhysicalPath.

Cela devrait vous débarrasser du rest des problèmes et créer le même répertoire que celui recherché par IIS.