2012-07-15 20 views
15

Ho un sito web che getta sporadicamente il seguente errore:DLL errori delle versioni

Server Error in '/' Application.

Could not load file or assembly 'ICSharpCode.SharpZipLib, Version=0.85.3.365, Culture=neutral, PublicKeyToken=1b03e6acf1164f73' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)

Ora so che io ho una dipendenza da questa DLL, ma io ho la versione 0.85.5 sul mio sistema . Ho sistematicamente cancellato ogni versione precedente della DLL dal server, ricompilato tutto e ripubblicato. Ma non importa quello che faccio, sembra che dopo ogni ripubblicazione, la prima o due volte che qualcuno visita il sito, ottengano questo errore. Quindi, dopo aver aggiornato una o due volte, l'errore scompare e il sito funziona normalmente.

Ciò che lo rende ancora più strano è se guardo la riga di codice in cui viene generata l'errore:

URLRewriter.ProcessRewritingResult(status, excludedEnum, siteName, viewMode, relativePath); 

URLRewriter è una classe da un pacchetto partito 3 ° (Kentico CMS - CMS.URLRewritingEngine.dll) . Ho eseguito Dependency Walker su quella DLL e non ho trovato alcuna dipendenza su ICSharpCode.SharpZipLib.

Qualche idea su come risolvere questo problema?

EDIT: A @ di JeremyThompson suggerimento, mi sono imbattuto Process Monitor per rilevare l'errore. Ecco uno screen dump, con parti rilevanti evidenziate (e un nome di cartella oscurato per motivi di privacy). È possibile visualizzare lo schermo intero cliccando col tasto destro su di esso, ecc ...

enter image description here

EDIT: Ecco una traccia carico dall'errore. questo aiuta?

=== Pre-bind state information ===

LOG: User = MY-SERVER-12\Administrator

LOG: DisplayName = ICSharpCode.SharpZipLib, Version=0.85.3.365, Culture=neutral, PublicKeyToken=1b03e6acf1164f73 (Fully-specified)

LOG: Appbase = file:///C:/inetpub/wwwroot/MySite/

LOG: Initial PrivatePath = C:\inetpub\wwwroot\MySite\bin

Calling assembly : CMS.WebAnalytics, Version=6.0.4377.2467, Culture=neutral, PublicKeyToken=834b12a258f213f9.

===

LOG: This bind starts in default load context.

LOG: Using application configuration file: C:\inetpub\wwwroot\MySite\web.config

LOG: Using host configuration file: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet.config

LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework64\v4.0.30319\config\machine.config.

LOG: Post-policy reference: ICSharpCode.SharpZipLib, Version=0.85.3.365, Culture=neutral, PublicKeyToken=1b03e6acf1164f73

LOG: Attempting download of new URL file:///C:/Windows/Microsoft.NET/Framework64/v4.0.30319/Temporary ASP.NET Files/root/9760eb69/275bb3db/ICSharpCode.SharpZipLib.DLL.

LOG: Attempting download of new URL file:///C:/Windows/Microsoft.NET/Framework64/v4.0.30319/Temporary ASP.NET Files/root/9760eb69/275bb3db/ICSharpCode.SharpZipLib/ICSharpCode.SharpZipLib.DLL.

LOG: Attempting download of new URL file:///C:/inetpub/wwwroot/MySite/bin/ICSharpCode.SharpZipLib.DLL.

LOG: Attempting download of new URL file:///C:/inetpub/wwwroot/MySite/bin/ICSharpCode.SharpZipLib/ICSharpCode.SharpZipLib.DLL.

LOG: Attempting download of new URL file:///C:/Windows/Microsoft.NET/Framework64/v4.0.30319/Temporary ASP.NET Files/root/9760eb69/275bb3db/ICSharpCode.SharpZipLib.EXE.

LOG: Attempting download of new URL file:///C:/Windows/Microsoft.NET/Framework64/v4.0.30319/Temporary ASP.NET Files/root/9760eb69/275bb3db/ICSharpCode.SharpZipLib/ICSharpCode.SharpZipLib.EXE.

LOG: Attempting download of new URL file:///C:/inetpub/wwwroot/MySite/bin/ICSharpCode.SharpZipLib.EXE.

LOG: Attempting download of new URL file:///C:/inetpub/wwwroot/MySite/bin/ICSharpCode.SharpZipLib/ICSharpCode.SharpZipLib.EXE.

+0

Hi Shual, questo solo per il ping del team di Kentico, ho affrontato con loro in passato e sono superiori tizi. Sono sicuro che darebbero un'occhiata a questo ora è in un forum pubblico. Questo ragazzo: @PetrPalas (http://stackoverflow.com/users/1430236/petr-palas), è davvero gentile. –

risposta

6

Now I know that I do have a dependency on this DLL, but I have version 0.85.5 on my system. I have systematically deleted every older version of the DLL from the server, recompiled everything and republished.

suona come la 'dipendenza' si aspetta la versione OLDER della DLL. Perché non REPLACE tutte le copie della versione NEWER (0.85.5) sul sistema, con la versione ANZIANO (0.85.3.365)? (Assicurati di controllare sia la cartella 'bin' della vostra applicazione web e 'GAC': C: \ WINDOWS \ assemblee)

Se avete bisogno, potete scaricare la versione precedente qui: http://sourceforge.net/projects/sharpdevelop/files/SharpZipLib/0.85.3/

NOTA :

  • Dopo aver sostituito la DLL, interrompere IIS e cancellare tutti i file temporanei di ASP.Net . Es .: C: \ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ Temporary ASP.NET Files
  • ANCHE: ricordarsi di aggiornare il Visual Studio soluzione in modo che i riferimenti la versione precedente.

Acclamazioni

Pete

+0

Bene, a quanto pare, non ho bisogno di nulla nella nuova versione della DLL, quindi questa soluzione funziona davvero per me. Anche se questa è una soluzione molto insoddisfacente dal punto di vista intellettuale, fa il trucco, e quindi rispondi a te e al merito. Grazie! –

4

Si dice che la prima o due volte che un utente visita il sito riceve l'errore.

per risolvere il problema vi consiglio di correre Process Monitor e vedere dove la sua ricerca per trovare e caricare l'assembly.

-iisreset
-start Process Monitor sul server
-view un paio di pagine e riprodurre il problema il più rapidamente possibile
-stop ProcessMonitor traccia
-Cerca nella traccia monitor di processo per ICSharpCode.SharpZipLib

Se non funziona, vedere che cosa è stata la causa:

-save i risultati ProcessMonitor come CSV
-aprire CSV in E Xcel
-filter tutte le colonne
-Scegli l'elenco a discesa della colonna verso il basso con l'accesso negato o ...

Questo dovrebbe dirvi qual è il problema con l'errore Could not load file or assembly

+0

Grazie per il consiglio. Trovo infatti che IIS Worker Process (w3wp.exe) sta cercando la v0.85.3 di quella DLL sia nel registro che nel file system e ottiene "NAME NOT FOUND" o "PATH NOT FOUND" .... fino a quando un qualche centinaio di microsecondi più tardi quando trova la versione 0.85.5 della DLL. Cosa ci dice questo? –

+1

In realtà sembra che stia tentando (e fallendo) di "Creare file" nel GAC, quindi nella cartella dei file temporanei .NET, prima di eseguire correttamente un "file di creazione" nella cartella bin del mio sito web. Perché "creare file", piuttosto che "leggere file"? –

4

Così si scopre che Kentico ha la sua dipendenza da ICSharpCode.SharpZipZip.dll - ed è in attesa di trovare la versione precedente. Ho trovato una soluzione simile here. Inserendo il seguente blocco nel mio file web.config, sembra che ho finalmente scacciato questo errore!

<runtime> 
    <assemblyBinding> 
    <dependentAssembly> 
     <assemblyIdentity name="ICSharpCode.SharpZipLib" publicKeyToken="1b03e6acf1164f73"/> 
     <bindingRedirect oldVersion="0.85.3.365" newVersion="0.85.5.452"/> 
    </dependentAssembly> 
    </assemblyBinding> 
</runtime> 

Quello che ancora non capisco è, perché non Dependency Tracker mostra questa dipendenza?

MODIFICA: Oh, caro, questo non ha risolto tutto sommato. Sembra che accada meno frequentemente ora, ma dopo aver riavviato IIS oggi, uno dei nostri tester ha di nuovo ricevuto il vecchio messaggio di errore! :-(

+1

Questo è ciò che avrei dovuto fare per il binding redirect => qualsiasi cosa da 0 a .85.5.452 (il che significa che includerebbe .85.3.365 ... uso 85.5.452. Es. '' –

0

Provare a collegare a AppDomain.CurrentDomain.AssemblyResolve, in modo da poter vedere quando/quanto i carichi di assemblaggio e in modo esplicito impostare posizione di carico.

+0

Come? Dove? Esempio di codice per favore? –

+0

http://msdn.microsoft.com/en-us/library/system.appdomain.assemblyresolve.aspx – user626528

+1

O utilizzare Assembly Binding Log Viewer (Fuslogvw.exe) per vedere come vengono sondati gli assembly http://msdn.microsoft.com/en-us/library/e74a18c4(v=vs.71).aspx ---- e vedere ---- http://stackoverflow.com/questions/255669/how-to-enable-assembly-bind-failure-logging-fusion-in-net –

0

sono la Kentico CMS e la vostra applicazione definito nello stesso pool di applicazioni? Prova eseguendo l'applicazione nel proprio pool di applicazioni

Ciò che potrebbe accadere è quando un processo di lavoro viene riciclato, a volte l'applicazione è la prima ad essere aggiunta e talvolta il Kentico CMS è il primo ad essere aggiunto e questo cambia il modo in cui ICSharpCode.SharpZipLib è stato risolto.

Quando si o il rinfrescante una o due volte per caso l'applicazione viene caricata per prima, il che significa che funziona.

What is Application Pool in IIS and Asp.Net?

UPDATE: è l'applicazione di un sito Web (compilato al primo accesso), o Project Web (pre-compilato in Visual Studio). Se si tratta di un sito Web, puoi convertirlo in un progetto Web e provarlo?

+0

Sono tutti distribuiti sotto lo stesso sito Web, quindi assicurati che stiano usando lo stesso pool di applicazioni ... :) –

1

penso che eri sulla strada giusta con il reindirizzamento vincolante. Tuttavia, mi permetta di suggerire che invece di legare l'app alla versione precedente, si tenta di associare l'assembly dipendente alla versione più recente.

In genere, forzare la versione precedente è la scelta peggiore, perché mentre potrebbe risolvere l'assembly dipendente, è possibile inserire errori di compatibilità nel codice che dipende dalla versione più recente.

+0

Non capisco ... I * sto * vincolante con la versione più recente ...? O ho ottenuto qualcosa di confuso nel mio codice lì? –

Problemi correlati