-
Aufgrund der begrenzten Leistung des Servers habe ich festgestellt, dass der Neukompilierungsprozess des Servers nach der Aktualisierung der Website seit der Verwendung von Castle + Nhibernate besonders langwierig ist und manchmal mehr als 1 Minute dauert, obwohl das veröffentlichte Webprogramm ebenfalls kompiliert wird. Die folgenden dynamischen Bibliotheken werden vom Web verwendet:
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
Jedes Mal, wenn mein Webprojekt aktualisiert und die nach der Neukompilierung generierte web.dll auf den Server hochgeladen wird, wird der Server w3p neu gestartet und die Dateien in meinem Webverzeichnis csc. Der gesamte Vorgang ist wirklich langwierig und unerträglich.
[Ich frage mich, ob ihr irgendwelche guten Vorschläge habt]
Später habe ich darüber nachgedacht, ob das Einfügen der oben genannten dynamischen Bibliotheken in den GAC die für den Neustart erforderliche Zeit verkürzen würde (die Praxis hat gezeigt, dass es keine offensichtliche Änderung gibt).
Dieser Artikel hat das ursprüngliche Problem nicht gelöst, aber da es sich um ein Problem beim Verweisen auf eine im GAC in asp.net gespeicherte dynamische Bibliothek eines Drittanbieters handelt, habe ich es trotzdem aufgezeichnet (:-) Dies ist der Schwerpunkt dieses Artikels).
Alle oben genannten dynamischen Bibliotheken sind signiert und der Prozess, sie in GAC einzufügen, ist wie folgt:
1. Registrieren Sie die dynamische Bibliothek eines Drittanbieters im 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
Dieser Vorgang ist relativ einfach. Gacutil befindet sich im SDK des .net-Frameworks (Redistributionspaket).
2. Definieren Sie neu, wie Webprojekte auf dynamische Bibliotheken von Drittanbietern verweisen: Verweisen Sie direkt auf GAC
Ein weiteres hier aufgetretenes Problem besteht darin, dass vs2005 nicht auf die in GAC definierte dynamische Bibliothek eines Drittanbieters verweisen kann, es sei denn, die folgenden Einstellungen werden vorgenommen:
Gehen Sie davon aus, dass die von Ihnen definierte dynamische Bibliothek eines Drittanbieters unter c:3rdlibs gespeichert ist
Ändern Sie die Registrierung: HKEY_LOCAL_MACHINESOFTWAREMicrosoft.NETFrameworkAssemblyFolders
Fügen Sie unter diesem Projekt ein Element hinzu und verweisen Sie es auf c:3rhlibs
Jetzt können wir in unseren Webprojekten auf GAC-Bibliotheken von Drittanbietern verweisen.
3. Kompilieren Sie das Web neu und debuggen Sie:
Das erste Problem: Konfigurationsfehler
Klartext in Zwischenablage anzeigen und drucken?
Konfigurationsfehler
Erläuterung: Beim Verarbeiten der Konfigurationsdateien, die zur Bearbeitung dieser Anfrage erforderlich sind, ist ein Fehler aufgetreten. Bitte überprüfen Sie die spezifischen Fehlerdetails unten und ändern Sie die Konfigurationsdatei entsprechend.
Parser-Fehlermeldung: Die Datei oder Assembly „UrlRewritingNet.UrlRewriter“ oder eine ihrer Abhängigkeiten kann nicht geladen werden. Das System kann die angegebene Datei nicht finden. (web.config Zeile 50)
Quellfehler:
Zeile 48:
Zeile 49: <httpModules>
Zeile 50: <add name="UrlRewriteModule" type="UrlRewritingNet.Web.UrlRewriteModule, UrlRewritingNet.UrlRewriter"/>
Quelldatei: web.config Zeilen: 50
Beschreibung des Konfigurationsfehlers: Beim Verarbeiten der für die Bearbeitung dieser Anfrage erforderlichen Konfigurationsdateien ist ein Fehler aufgetreten. Bitte überprüfen Sie die spezifischen Fehlerdetails unten und ändern Sie die Konfigurationsdatei entsprechend.
Parser-Fehlermeldung: Die Datei oder Assembly „UrlRewritingNet.UrlRewriter“ oder eine ihrer Abhängigkeiten kann nicht geladen werden. Das System kann die angegebene Datei nicht finden. (web.config Zeile 50)
Quellfehler:
Zeile 48:
Zeile 49: <httpModules>
Zeile 50: <add name="UrlRewriteModule" type="UrlRewritingNet.Web.UrlRewriteModule, UrlRewritingNet.UrlRewriter"/>
Quelldatei: web.config Zeilen: 50
Offensichtlich hat unser Webprojekt die bereits im GAC gespeicherte Bibliothek nicht gefunden. Vor dem Einfügen in GAC werden diese Bibliotheken kompiliert und im Verzeichnis web/bin ausgegeben. Da sie nun nicht automatisch gefunden werden kann, können wir web.config ändern, um anzugeben, wie auf die Bibliothek verwiesen wird:
Klartext in Zwischenablage anzeigen und drucken?
<Konfiguration>
...
<Laufzeit>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<qualifyAssembly partialName="log4net" fullName="log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=1b44e1d426115821"/>
<qualifyAssembly 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>
</runtime>
</configuration>
<Konfiguration>
...
<Laufzeit>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<qualifyAssembly partialName="log4net" fullName="log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=1b44e1d426115821"/>
<qualifyAssembly 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>
</runtime>
</configuration>
Kompilieren, debuggen und erneut ausführen
Zweiter Fehler: Kompilierungsfehler
Klartext in Zwischenablage anzeigen und drucken?
Serverfehler in der Anwendung „/“.
-------------------------------------------------- ----------------------------------
Kompilierungsfehler
Erläuterung: Beim Kompilieren der für die Bearbeitung dieser Anforderung erforderlichen Ressourcen ist ein Fehler aufgetreten. Bitte überprüfen Sie die folgenden spezifischen Fehlerdetails und ändern Sie den Quellcode entsprechend.
Compiler-Fehlermeldung: CS0012: Der Typ „Castle.Windsor.IContainerAccessor“ ist in einer Assembly definiert, auf die nicht verwiesen wird. Es muss ein Verweis auf die Assembly „Castle.Windsor, Version=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc“ hinzugefügt werden.
Quellfehler:
[Keine relevanten Quellzeilen]
Quelldatei: c:WINDOWSMicrosoft.NETFrameworkv2.0.50727Temporary ASP.NET FilesrootxxxxxxyyyyyyyyApp_Web_default.aspx.zzzzzzz.aaaaaaaa.0.cs Zeile: 133
Serverfehler in der Anwendung „/“.
-------------------------------------------------- ----------------------------------
Beschreibung des Kompilierungsfehlers: Beim Kompilieren der für die Bearbeitung dieser Anforderung erforderlichen Ressourcen ist ein Fehler aufgetreten. Bitte überprüfen Sie die folgenden spezifischen Fehlerdetails und ändern Sie den Quellcode entsprechend.
Compiler-Fehlermeldung: CS0012: Der Typ „Castle.Windsor.IContainerAccessor“ ist in einer Assembly definiert, auf die nicht verwiesen wird. Es muss ein Verweis auf die Assembly „Castle.Windsor, Version=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc“ hinzugefügt werden.
Quellfehler:
[Keine relevanten Quellzeilen]
Quelldatei: c:WINDOWSMicrosoft.NETFrameworkv2.0.50727Temporary ASP.NET FilesrootxxxxxxyyyyyyyyApp_Web_default.aspx.zzzzzzz.aaaaaaaa.0.cs Zeile: 133
Diesmal handelt es sich um einen Kompilierungsfehler, aber die Fehlermeldung ist nicht klar und der spezifische Inhalt kann vorerst nicht gefunden werden. Ändern Sie web.config und fügen Sie einen Konfigurationsabschnitt (Kompilierung) wie folgt hinzu
Klartext in Zwischenablage anzeigen und drucken?
<Konfiguration>
<system.web>
... ...
<compilation debug="true" />
... ...
</system.web>
</configuration>
<Konfiguration>
<system.web>
... ...
<compilation debug="true" />
... ...
</system.web>
</configuration>
Nochmals debuggen:
Klartext in Zwischenablage anzeigen und drucken?
Kompilierungsfehler
Erläuterung: Beim Kompilieren der für die Bearbeitung dieser Anforderung erforderlichen Ressourcen ist ein Fehler aufgetreten. Bitte überprüfen Sie die folgenden spezifischen Fehlerdetails und ändern Sie den Quellcode entsprechend.
Compiler-Fehlermeldung: CS0012: Der Typ „Castle.Windsor.IContainerAccessor“ ist in einer Assembly definiert, auf die nicht verwiesen wird. Es muss ein Verweis auf die Assembly „Castle.Windsor, Version=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc“ hinzugefügt werden.
Quellfehler:
Zeile 134: }
Zeile 135:
Zeile 136: protected ASP.global_asax ApplicationInstance {
Zeile 137: get {
Zeile 138: return ((ASP.global_asax)(this.Context.ApplicationInstance));
Quelldatei: c:WINDOWSMicrosoft.NETFrameworkv2.0.50727Temporary ASP.NET FilesrootxxxxxxyyyyyyyyApp_Web_default.aspx.zzzzzzz.aaaaaaaa.0.cs Zeile: 136
Beschreibung des Kompilierungsfehlers: Beim Kompilieren der für die Bearbeitung dieser Anforderung erforderlichen Ressourcen ist ein Fehler aufgetreten. Bitte überprüfen Sie die folgenden spezifischen Fehlerdetails und ändern Sie den Quellcode entsprechend.
Compiler-Fehlermeldung: CS0012: Der Typ „Castle.Windsor.IContainerAccessor“ ist in einer Assembly definiert, auf die nicht verwiesen wird. Es muss ein Verweis auf die Assembly „Castle.Windsor, Version=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc“ hinzugefügt werden.
Quellfehler:
Zeile 134: }
Zeile 135:
Zeile 136: protected ASP.global_asax ApplicationInstance {
Zeile 137: get {
Zeile 138: return ((ASP.global_asax)(this.Context.ApplicationInstance));
Quelldatei: c:WINDOWSMicrosoft.NETFrameworkv2.0.50727Temporary ASP.NET FilesrootxxxxxxyyyyyyyyApp_Web_default.aspx.zzzzzzz.aaaaaaaa.0.cs Zeile: 136
Diese Fehlermeldung ist die wichtigste:
Compiler-Fehlermeldung: CS0012: Der Typ „Castle.Windsor.IContainerAccessor“ ist in einer Assembly definiert, auf die nicht verwiesen wird. Es muss ein Verweis auf die Assembly „Castle.Windsor, Version=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc“ hinzugefügt werden.
Nachdem wir web.config geändert haben, hat der iis-Dienst das aktuelle Webprojekt neu gestartet und kompiliert. Eine der initialisierten Variablen ist möglicherweise auch eine statische Variable. Windsor wird aufgerufen und csc kann dieses Castle.Windsor nicht finden, was ein wirklich mühsamer Prozess ist.
Erster Versuch: Legen Sie im Referenzabschnitt des Webprojekts Castle.Windsor fest. Als die dynamische Bibliothek ursprünglich referenziert wurde, wurde sie synchron nach dem GAC ausgegeben . Auf „Nach lokal kopieren“ einstellen. Natürlich wird nach der Kompilierung diese Datei ausgegeben: Castle.Windsor in web/bin. Auf diese Weise kann das Debuggen auch durchgeführt werden, da er diese dynamische Bibliothek gefunden hat.
Dies lindert jedoch nicht unsere Zweifel, das heißt, die in <runtime><assemblyBinding>... ...</assemblyBinding><runtime> definierte Assembly hat keinen Einfluss auf den Kompilierungsprozess und muss daher während des Kompilierungsprozesses verwendet werden Um welchen Abschnitt handelt es sich?
Zweiter Versuch: Denken Sie beim ersten Versuch an den Abschnitt (Kompilierung), überprüfen Sie die MSDN-Beschreibung und stellen Sie sicher, dass in <Kompilierung> eine Definition von <Assemblies> vorhanden ist. Fügen Sie die Konfiguration wie folgt hinzu:
Klartext in Zwischenablage anzeigen und drucken?
<compilation debug="false">
<Baugruppen>
<addassembly="Castle.Windsor, Version=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc"/>
</assemblies>
</compilation>
<compilation debug="false">
<Baugruppen>
<addassembly="Castle.Windsor, Version=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc"/>
</assemblies>
</compilation>
Brechen Sie dann „Nach lokal kopieren“ für Castle.Windsor im Webprojekt ab, kompilieren Sie es erneut und führen Sie es aus.
Alle funktionieren einwandfrei.
Zu diesem Zeitpunkt haben wir alle dynamischen Bibliotheken, auf die Dritte verweisen, erfolgreich in den GAC eingefügt.