2009-04-20 15 views
6

Ok Ich habe ein sehr merkwürdiges Problem, wenn wir eine unserer Webanwendungen auf unseren Live-Servern bereitstellen.Konnte Datei oder Baugruppe nicht laden 'log4net

Unsere Anwendung verwendet log4net, um eine Menge von Aktionen ziemlich stark zu protokollieren und nach ein paar Stunden nach der Bereitstellung erhalten wir die folgende Ausnahme.

Konnte die Datei oder Assembly 'log4net, Version = 1.2.9.0, Culture = neutral, PublicKeyToken = b32731d11ce58905' oder eine ihrer Abhängigkeiten nicht laden. Der Zugriff wurde verweigert.

Hier sind die relevanten web.config Ergänzungen, die ich verwende.

<configSections> 
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/> 
    </configSections> 

<log4net> 
    <appender name="ErrorLogFileAppender" type="log4net.Appender.RollingFileAppender"> 
     <param name="File" value="D:\SomeLocation\Errorlog"/> 
     <param name="AppendToFile" value="true"/> 
     <param name="RollingStyle" value="Size"/> 
     <param name="maxSizeRollBackups" value="-1" /> 
     <param name="maximumFileSize" value="100MB" /> 
     <layout type="log4net.Layout.PatternLayout"> 
     <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n"/> 
     </layout> 
     <filter type="log4net.Filter.LevelRangeFilter"> 
     <param name="LevelMin" value="FATAL" /> 
     <param name="LevelMax" value="FATAL" /> 
     </filter> 
    </appender> 
    <appender name="BookingLogFileAppender" type="log4net.Appender.RollingFileAppender"> 
     <param name="File" value="D:\SomeLocation\BookingInfoLog"/> 
     <param name="AppendToFile" value="true"/> 
     <param name="RollingStyle" value="Size"/> 
     <param name="maxSizeRollBackups" value="-1" /> 
     <param name="maximumFileSize" value="100MB" /> 
     <layout type="log4net.Layout.PatternLayout"> 
     <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n"/> 
     </layout> 
     <filter type="log4net.Filter.LevelRangeFilter"> 
     <param name="LevelMin" value="INFO" /> 
     <param name="LevelMax" value="FATAL" /> 
     </filter> 
    </appender> 
    <root> 
     <level value="ALL"/> 
     <appender-ref ref="BookingLogFileAppender"/> 
     <appender-ref ref="ErrorLogFileAppender"/> 
    </root> 

    </log4net> 

Es funktioniert gut auf unseren lokalen Maschinen ein Dev-Server, aber nur nicht auf dem Laufenden.

Übrigens scheint es zu brechen, nachdem der JIT-Compiler auf dem Server ausgeführt wird, nachdem ein web.config-Update oder ein App-Pool recycelt wurde, oder sogar nur einen langen Zeitraum!

UPDATE: Unsere Live-Server führen alle Websites von einem freigegebenen Speicherort aus. Ich konnte dieses Problem auf einem anderen Server replizieren, auf dem die Anwendung von einer Freigabe ausgeführt wird. Wenn die Site so eingerichtet wird, dass sie von einem lokalen Laufwerk ausgeführt wird, geht das Problem verloren, aber unser Hosting erfordert, dass wir von einer Freigabe aus starten. Irgendwelche Ideen, warum log4net Berechtigungsprobleme haben würde, die von einer Freigabe laufen. Auch hier läuft die App erstmals, bis eine andere JIT-Kompilierung

+0

Ich habe genau das gleiche Problem wie Sie. Hast du jemals eine Lösung dafür bekommen? – gabe

Antwort

1

Überprüfen Sie die Version auftritt, den Sie in der Kompilierung (Ihre Dateireferenz) und die Version binden, die Laufzeit verwendet wird (zuerst im GAC suchen, dann lokal)

Gewöhnlich Die Version in der GAC unterscheidet sich von der Version, die Sie als Dateiverweis haben. Bitte prüfen Sie das.

Auch Bereinigung des ASP.NET temporäre Verzeichnis und führen Sie IIS Neustart (cmd Aufforderung -> iisreset)

+0

Aber wenn wir nicht auf die GAC verweisen, verweisen wir nur auf die DLL. Vielleicht ist mein Verständnis der GAC falsch? – Sheff

+0

Referenz Assemblies ist immer Build-Zeit, GAC ist immer Laufzeit. Klicken Sie auf die Assembly, auf die in Ihrem C# -Projekt verwiesen wird. Schau dir die Signatur an. Dann schau in den GAC, überprüfe, ob der Assemblyname dort registriert ist. Wenn ja, überprüfen Sie beide Versionen (die, auf die Sie verwiesen haben, und die im GAC). Wenn sie sich unterscheiden, haben Sie ein Problem –

5

Probally das Offensichtliche zu fragen, aber ich bin die log4net.dll in Ihrem Ordner ist unter der Annahme ist die richtige Version?

Wenn Sie mehr als ein Projekt haben, das auf verschiedene Versionen derselben DLL verweist, ist es nicht ungewöhnlich, dass das spätere Projekt die DLL über die vorherige Version kopiert.

Unter der Annahme, dass Sie mehr als eine Kopie von log4net haben, um die beste Lösung unterstützt wird ich denken kann, sind Sie hinzuzufügen Config Sondieren und diese Version in einem anderen Ordner.

http://msdn.microsoft.com/en-us/library/823z9h8w.aspx

+0

Das ist interessant, wir haben mehrere Projekte auf diesem Server mit log4net. Ich bin mir ziemlich sicher, dass sie die gleiche Version verwenden, ich werde Ihren Vorschlag versuchen. Warum sollte das Ausführen des Projekts von einer lokalen Festplatte funktionieren, aber nicht von einer Freigabe? – Sheff

+0

Eine Freigabe ist nur ein teilweise vertrauenswürdiger Speicherort standardmäßig können Sie hinzufügen, um die volle Vertrauenswürdigkeit zu haben, ich den Namen der Eingabeaufforderung vergessen, aber es gibt ".NET Framework 2.0 Konfiguration" mmc Snap-in, die es für Sie konifgurieren kann. Können Sie bestätigen, dass die Version von log4net in Ihrem bin-Ordner die Version 1.2.9.0 ist und der öffentliche Schlüssel korrekt ist? Sie können mit der rechten Maustaste auf die Datei klicken und Eigenschaften auswählen, um das herauszufinden. –

+0

Obwohl ich die log4net.dll nicht als Referenz verwendet habe, befand sie sich in meinem bin-Ordner. Einmal entfernt, habe ich den Fehler 500 nicht mehr bekommen ... – Cerveser

8

Wir hatten dieses Problem auch, wenn wir in VS 2010 und .NET 4.0 bewegt, wir log4net gar nicht, aber ich vermute, etwas anderes tut die wir verwenden (vielleicht Crystal Reports?) Und ich auch vermuten, dass es eine dll gibt, die wir verwenden, das ist eine 32-Bit-DLL auch, weil, wenn ich die Option "32-Bit-Anwendungen aktivieren" unter den erweiterten Einstellungen für den Anwendungspool in IIS auf "True" alles wieder funktioniert.

+0

Danke. Ich hatte gerade dieses Problem und Ihre Antwort hat mir geholfen. Aber seltsamerweise hatte ich das umgekehrte Problem. Ich hatte "Enable 32-bit Applications" auf "True" gesetzt, und es begann wieder zu arbeiten, wenn ich es auf "False" gesetzt. – Bob

+0

Hinweis: Per Matts Kommentar. Crystal Reports hat log4net aufgerufen. –

0

Ich wette, Ihr JIT-Compiler hat keinen Schreibzugriff auf die Freigabe. Es sieht so aus, als ob der JIT-Compiler von Zeit zu Zeit die gesamte Site neu kompiliert, vielleicht, wenn sie recycelt wird.

Eine Möglichkeit besteht darin, die vordefinierte Site bereitzustellen. Auf diese Weise gibt es keine Neukompilierung. Die andere Option besteht darin, dass Sie Ihrem JIT-Compiler Schreibzugriff auf Ihre Freigabe gewähren. Wahrscheinlich ist es derselbe Benutzer wie derjenige, der Ihren Webservice ausführt, z.SYSTEM, NETZWERKDIENST oder LOKALER SERVICE Gruppen oder vielleicht einer der IIS_ * Benutzer ...

Verwandte Themen