-
En raison des performances limitées du serveur, j'ai constaté que depuis l'utilisation de Castle + Nhibernate, le processus de recompilation du serveur après la mise à jour du site web est particulièrement long, prenant parfois plus d'une minute, même si le programme web publié est également compilé. Voici les bibliothèques dynamiques utilisées par le Web :
Castle.Core.dll
Castle.DynamicProxy2.dll
Castle.Facilities.AutomaticTransactionManagement.dll
Castle.Facilities.NHibernateIntegration.dll
Castle.MicroKernel.dll
Castle.Services.Transaction.dll
Castle.Windsor.dll
FredCK.FCKeditorV2.dll
Iesi.Collections.dll
log4net.dll
MySql.Data.dll/System.Data.SQLite.dll
NHibernate.dll
UrlRewritingNet.UrlRewriter.dll
Chaque fois que mon projet Web est mis à jour et que le web.dll généré après la recompilation est téléchargé sur le serveur, le serveur w3p redémarre et csc les fichiers de mon répertoire Web. L'ensemble du processus est vraiment long et insupportable.
[Je me demande si vous avez de bonnes suggestions]
Plus tard, j'ai réfléchi à la question de savoir si le fait de placer les bibliothèques dynamiques ci-dessus dans le GAC réduirait le temps nécessaire au redémarrage (la pratique a prouvé qu'il n'y avait pas de changement évident).
Cet article n'a pas résolu le problème d'origine, mais comme il implique un problème de référencement d'une bibliothèque dynamique tierce stockée dans le GAC dans asp.net, je l'ai quand même enregistré (:-) C'est l'objet de cet article).
Toutes les bibliothèques dynamiques ci-dessus sont signées et le processus de mise dans GAC est le suivant :
1. Enregistrez la bibliothèque dynamique tierce dans GAC
gacutil -i Castle.Core.dll
gacutil -i Castle.DynamicProxy2.dll
gacutil -i Castle.Facilities.AutomaticTransactionManagement.dll
gacutil -i Castle.Facilities.NHibernateIntegration.dll
gacutil -i Castle.MicroKernel.dll
gacutil -i Castle.Services.Transaction.dll
gacutil -i Castle.Windsor.dll
gacutil -i FredCK.FCKeditorV2.dll
gacutil -i Iesi.Collections.dll
gacutil -i Intelligencia.UrlRewriter.dll
gacutil -i log4net.dll
gacutil -i MySql.Data.dll
gacutil -i NHibernate.dll
gacutil -i System.Data.SQLite.dll
gacutil -i UrlRewritingNet.UrlRewriter.dll
Ce processus est relativement simple, gacutil peut être trouvé sous le sdk du framework .net (package de redistribution)
2. Redéfinir la manière dont les projets Web référencent les bibliothèques dynamiques tierces : référencez directement GAC
Un autre problème rencontré ici est que vs2005 ne peut pas référencer la bibliothèque dynamique tierce définie dans GAC à moins que les paramètres suivants ne soient définis :
Supposons que la bibliothèque dynamique tierce que vous avez définie soit stockée dans : c:3rdlibs
Modifiez le registre : HKEY_LOCAL_MACHINESOFTWAREMicrosoft.NETFrameworkAssemblyFolders
Ajoutez un élément sous ce projet et pointez-le vers c:3rhlibs
Nous pouvons désormais référencer des bibliothèques GAC tierces dans nos projets Web.
3. Recompilez le Web et déboguez :
Le premier problème : erreur de configuration
afficher la copie ordinaire dans le presse-papiers ?
Erreur de configuration
Explication : Une erreur s'est produite lors du traitement des fichiers de configuration requis pour traiter cette demande. Veuillez vérifier les détails de l'erreur spécifique ci-dessous et modifier le fichier de configuration en conséquence.
Message d'erreur de l'analyseur : impossible de charger le fichier ou l'assembly « UrlRewritingNet.UrlRewriter » ou l'une de ses dépendances. Le système ne trouve pas le fichier spécifié. (ligne 50 du fichier web.config)
Erreur source :
Ligne 48 :
Ligne 49 : <httpModules>
Ligne 50 : <add name="UrlRewriteModule" type="UrlRewritingNet.Web.UrlRewriteModule, UrlRewritingNet.UrlRewriter"/>
Fichier source : web.config Lignes : 50
Description de l'erreur de configuration : une erreur s'est produite lors du traitement des fichiers de configuration requis pour traiter cette demande. Veuillez vérifier les détails de l'erreur spécifique ci-dessous et modifier le fichier de configuration en conséquence.
Message d'erreur de l'analyseur : impossible de charger le fichier ou l'assembly « UrlRewritingNet.UrlRewriter » ou l'une de ses dépendances. Le système ne trouve pas le fichier spécifié. (ligne 50 du fichier web.config)
Erreur source :
Ligne 48 :
Ligne 49 : <httpModules>
Ligne 50 : <add name="UrlRewriteModule" type="UrlRewritingNet.Web.UrlRewriteModule, UrlRewritingNet.UrlRewriter"/>
Fichier source : web.config Lignes : 50
Évidemment, notre projet web n'a pas trouvé la bibliothèque déjà stockée dans le GAC. Avant d'être placées dans GAC, ces bibliothèques sont compilées et sorties dans le répertoire web/bin. Maintenant qu'elle ne peut pas être localisée automatiquement, nous pouvons modifier web.config pour spécifier comment la bibliothèque est référencée :
afficher la copie ordinaire dans le presse-papiers ?
<configuration>
...
<exécution>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<qualififyAssembly partialName="log4net" fullName="log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=1b44e1d426115821"/>
<qualififyAssembly partialName="Castle.Windsor" fullName="Castle.Windsor, Version=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc"/>
<qualifyAssembly partialName="Castle.MicroKernel" fullName="Castle.MicroKernel, Version=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc"/>
... ...
</assemblyBinding>
</exécution>
</configuration>
<configuration>
...
<exécution>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<qualififyAssembly partialName="log4net" fullName="log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=1b44e1d426115821"/>
<qualififyAssembly partialName="Castle.Windsor" fullName="Castle.Windsor, Version=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc"/>
<qualifyAssembly partialName="Castle.MicroKernel" fullName="Castle.MicroKernel, Version=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc"/>
... ...
</assemblyBinding>
</exécution>
</configuration>
Compiler, déboguer et réexécuter
Deuxième erreur : erreur de compilation
afficher la copie ordinaire dans le presse-papiers ?
Erreur de serveur dans l'application '/'.
-------------------------------------------------- ----------------------------------
Erreur de compilation
Explication : Une erreur s'est produite lors de la compilation des ressources requises pour traiter cette demande. Veuillez vérifier les détails de l'erreur spécifique suivante et modifier le code source en conséquence.
Message d'erreur du compilateur : CS0012 : le type « Castle.Windsor.IContainerAccessor » est défini dans un assembly qui n'est pas référencé. Une référence à l'assembly "Castle.Windsor, Version=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc" doit être ajoutée.
Erreur source :
[Aucune ligne source pertinente]
Fichier source : c:WINDOWSMicrosoft.NETFrameworkv2.0.50727Temporary ASP.NET FilesrootxxxxxxyyyyyyyyApp_Web_default.aspx.zzzzzzzz.aaaaaaaa.0.cs Ligne : 133
Erreur de serveur dans l'application '/'.
-------------------------------------------------- ----------------------------------
Description de l'erreur de compilation : une erreur s'est produite lors de la compilation des ressources requises pour répondre à cette demande. Veuillez vérifier les détails de l'erreur spécifique suivante et modifier le code source en conséquence.
Message d'erreur du compilateur : CS0012 : le type « Castle.Windsor.IContainerAccessor » est défini dans un assembly qui n'est pas référencé. Une référence à l'assembly "Castle.Windsor, Version=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc" doit être ajoutée.
Erreur source :
[Aucune ligne source pertinente]
Fichier source : c:WINDOWSMicrosoft.NETFrameworkv2.0.50727Temporary ASP.NET FilesrootxxxxxxyyyyyyyyApp_Web_default.aspx.zzzzzzzz.aaaaaaaa.0.cs Ligne : 133
Cette fois, il s'agit d'une erreur de compilation, mais le message d'erreur n'est pas clair et le contenu spécifique ne peut pas être localisé pour le moment. Modifiez web.config et ajoutez une section de configuration (compilation), comme suit.
afficher la copie ordinaire dans le presse-papiers ?
<configuration>
<système.web>
... ...
<compilation debug="true" />
... ...
</system.web>
</configuration>
<configuration>
<système.web>
... ...
<compilation debug="true" />
... ...
</system.web>
</configuration>
Débogage à nouveau :
afficher la copie ordinaire dans le presse-papiers ?
Erreur de compilation
Explication : Une erreur s'est produite lors de la compilation des ressources requises pour traiter cette demande. Veuillez vérifier les détails de l'erreur spécifique suivante et modifier le code source en conséquence.
Message d'erreur du compilateur : CS0012 : le type « Castle.Windsor.IContainerAccessor » est défini dans un assembly qui n'est pas référencé. Une référence à l'assembly "Castle.Windsor, Version=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc" doit être ajoutée.
Erreur source :
Ligne 134 : }
Ligne 135 :
Ligne 136 : protégé ASP.global_asax ApplicationInstance {
Ligne 137 : obtenez {
Ligne 138 : return ((ASP.global_asax)(this.Context.ApplicationInstance));
Fichier source : c:WINDOWSMicrosoft.NETFrameworkv2.0.50727Temporary ASP.NET FilesrootxxxxxxyyyyyyyyApp_Web_default.aspx.zzzzzzzz.aaaaaaaa.0.cs Ligne : 136
Description de l'erreur de compilation : une erreur s'est produite lors de la compilation des ressources requises pour répondre à cette demande. Veuillez vérifier les détails de l'erreur spécifique suivante et modifier le code source en conséquence.
Message d'erreur du compilateur : CS0012 : le type « Castle.Windsor.IContainerAccessor » est défini dans un assembly qui n'est pas référencé. Une référence à l'assembly "Castle.Windsor, Version=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc" doit être ajoutée.
Erreur source :
Ligne 134 : }
Ligne 135 :
Ligne 136 : protégé ASP.global_asax ApplicationInstance {
Ligne 137 : obtenez {
Ligne 138 : return ((ASP.global_asax)(this.Context.ApplicationInstance));
Fichier source : c:WINDOWSMicrosoft.NETFrameworkv2.0.50727Temporary ASP.NET FilesrootxxxxxxyyyyyyyyApp_Web_default.aspx.zzzzzzzz.aaaaaaaa.0.cs Ligne : 136
Ce message d'erreur est le plus important :
Message d'erreur du compilateur : CS0012 : le type « Castle.Windsor.IContainerAccessor » est défini dans un assembly qui n'est pas référencé. Une référence à l'assembly "Castle.Windsor, Version=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc" doit être ajoutée.
Évidemment, après avoir modifié web.config, le service iis a redémarré le projet Web en cours et l'a compilé. La première chose à compiler était global.asax.cs. L'une des variables initialisées peut également être une variable statique, Castle. Windsor est appelé et csc ne parvient pas à trouver ce Castle.Windsor, ce qui est vraiment un processus fastidieux.
Première tentative : dans la section de référence du projet Web, définissez Castle.Windsor. À l'origine, lorsque la bibliothèque dynamique était directement référencée, elle était sortie sur web/bin de manière synchrone. Une fois le GAC référencé, cette sortie a été annulée. . Réglez sur "Copier vers local". Bien sûr, la compilation après paramétrage produira ce fichier : Castle.Windsor vers web/bin De cette façon, le débogage peut également réussir car il a trouvé cette bibliothèque dynamique.
Mais cela ne dissipe pas nos doutes, c'est-à-dire que l'Assembly défini dans <runtime><assemblyBinding>... ...</assemblyBinding><runtime> n'affecte pas le processus de compilation, il doit donc être utilisé pendant le processus de compilation De quelle rubrique s'agit-il ?
Deuxième tentative : pensez à la section (compilation) lors de la première tentative, vérifiez la description msdn et sachez qu'il existe une définition de <assemblies> dans <compilation>. Ajoutez la configuration comme suit :
afficher la copie ordinaire dans le presse-papiers ?
<compilation debug="false">
<assemblages>
<add assembly="Castle.Windsor, Version=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc"/>
</assemblages>
</compilation>
<compilation debug="false">
<assemblages>
<add assembly="Castle.Windsor, Version=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc"/>
</assemblages>
</compilation>
Annulez ensuite "Copier vers local" pour Castle.Windsor dans le projet Web, recompilez et exécutez.
Tous fonctionnent bien.
À ce stade, nous avons réussi à placer toutes les bibliothèques dynamiques référencées par des tiers dans le GAC.