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.
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:
ClientBuildManager
. ComstackFile
Configuration var buildParameter = new ClientBuildManagerParameter { PrecompilationFlags = PrecompilationFlags.Default, }; var clientBuildManager = new ClientBuildManager( RootVirtualPath, RootPhysicalPath, null, buildParameter); ... clientBuildManager.ComstackFile(relativeVirtualPath, callback);
Où 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:
/LM/W3SVC/7/ROOT/
pour appVirtualDir
appPhysicalSourceDir
Notez que le ‘7’ est juste un exemple. Pour obtenir le bon numéro:
/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
BuildManager.GetComstackdType("~/myfile.aspx")
et des appels similaires pour chaque page (ou contrôle utilisateur, etc.) que vous souhaitez précomstackr. 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.