2012-07-15 35 views
15

Tengo un sitio web que lanza de forma esporádica el siguiente error:DLL de error de versiones

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)

Ahora sé que tengo una dependencia de esta DLL, pero tengo la versión 0.85.5 en mi sistema . He eliminado sistemáticamente cada versión anterior de la DLL del servidor, recompité todo y volví a publicar. Pero no importa lo que haga, parece que después de cada publicación, la primera o dos veces que alguien visita el sitio, obtienen este error. Luego, después de actualizar una o dos veces, el error desaparece y el sitio funciona normalmente.

Lo que lo hace aún más raro es que si miro la línea de código en la que se lanza el error:

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

URLRewriter es una clase de un paquete del partido tercero (Kentico CMS - CMS.URLRewritingEngine.dll) . Ejecuté Dependency Walker en esa DLL y no encontré dependencias de ningún tipo en ICSharpCode.SharpZipLib.

¿Alguna idea de cómo solucionar esto?

EDIT: En la sugerencia de @ JeremyThompson, ejecuté Process Monitor para detectar el error. Aquí hay un volcado de pantalla, con piezas relevantes resaltadas (y un nombre de carpeta oscurecido por razones de privacidad). También se puede ver a tamaño completo haciendo clic derecho sobre el mismo, etc ...

enter image description here

EDIT: Aquí un rastro de carga del error. ¿Esto ayuda?

=== 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

Hola-sual, esto sólo para hacer ping al equipo Kentico, he tratado con ellos en el pasado y son los mejores tíos. Estoy seguro de que echarán un vistazo a esto ahora es en un foro público. Este tipo: @PetrPalas (http://stackoverflow.com/users/1430236/petr-palas), él es realmente agradable. –

Respuesta

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.

suena como la 'dependencia' está a la espera de la versión anterior de la DLL. ¿Por qué no SUSTITUIR todas las copias de la MÁS NUEVA versión (0.85.5) en su sistema, con la versión OLDER (0.85.3.365)? (Asegúrese de revisar tanto la carpeta 'bin' de su aplicación web y el 'GAC': c: \ windows \ asambleas)

Si necesita, se puede descargar la versión anterior aquí: http://sourceforge.net/projects/sharpdevelop/files/SharpZipLib/0.85.3/

NOTA :

  • Después de reemplazar la DLL, detenga IIS y borre todos los archivos temporales de ASP.NET . Ej .: C: \ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ Temporary ASP.NET archivos
  • también: Recuerde actualizar su solución de Visual Studio para que referencias de la versión anterior.

Saludos

Pete

+0

Bueno, como resulta, no necesito nada en la versión más reciente de la DLL, por lo que esta solución realmente funciona para mí. A pesar de que esta es una solución muy insatisfactoria desde un punto de vista intelectual, hace el truco, y así responder crédito y generosidad para usted. ¡Gracias! –

4

Menciona que las primeras una o dos veces que un usuario visita el sitio recibe el error.

Para solucionar el problema le sugiero que ejecute Process Monitor y vea dónde está buscando para encontrar y cargar el conjunto.

-iisreset
-start monitor de procesos en el servidor
-view un par de páginas y reproducir el problema lo más rápido posible
-stop la traza ProcessMonitor
-search en el seguimiento de monitor de proceso para ICSharpCode.SharpZipLib

Si eso no funciona, ver qué otra cosa era la causa:

-save los resultados ProcessMonitor como CSV
-open la CSV en E Xcel
-Filter todas las columnas
Lee la lista de lista desplegable de la columna hacia abajo con el acceso denegado o ...

Esto debe decirle cuál es el problema con el error Could not load file or assembly

+0

Gracias por el consejo. De hecho, me parece que el proceso de trabajo de IIS (w3wp.exe) está buscando v0.85.3 de esa DLL tanto en el registro como en el sistema de archivos y obtiene "NOMBRE NO ENCONTRADO" o "RUTA NO ENCONTRADA" ... hasta que doscientos microsegundos más tarde cuando encuentre la versión 0.85.5 de la DLL. Que nos dice eso? –

+1

En realidad, parece estar intentando (y fallando) "Crear archivo" en el GAC, luego en la carpeta de archivos temporales .NET, antes de hacer con éxito un "archivo de creación" en la carpeta bin de mi sitio web. ¿Por qué "crear archivo", en lugar de "leer archivo"? –

4

Así que resulta que Kentico tiene su propia dependencia en ICSharpCode.SharpZipZip.dll - y espera encontrar la versión anterior. Encontré una solución similar here. Al insertar el siguiente bloque en mi archivo web.config, ¡parece que finalmente he desterrado este error!

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

Lo que todavía no entiendo es, ¿por qué Dependency Tracker no mostró esta dependencia?

EDITAR: Oh cariño, esto no lo resolvió después de todo. Parece que ahora es menos frecuente, pero después de reiniciar IIS hoy, uno de nuestros probadores recibió el mensaje de error anterior nuevamente. :-(

+1

Esto es lo que habría hecho para la redirección de enlace => cualquier cosa de 0 a .85.5.452 (lo que significa que incluiría .85.3.365 ... use 85.5.452. Por ejemplo, '' –

0

Intente conectar a AppDomain.CurrentDomain.AssemblyResolve, para que pueda ver cuándo/qué carga de montaje y establecer explícitamente la ubicación de carga.

+0

¿Cómo? ¿Muestra de código? –

+0

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

+1

O utilice el Visor de registro de encuadernación por ensamblaje (Fuslogvw.exe) para ver cómo se están sondeando los ensamblajes http://msdn.microsoft.com/en-us/library/e74a18c4(v=vs.71).aspx ---- y ver ---- http://stackoverflow.com/questions/255669/how-to-enable-assembly-bind-failure-logging-fusion-in-net –

0

son la Kentico CMS y su aplicación definida en el mismo grupo de aplicaciones? Pruebe ejecutar su aplicación en su propio grupo de aplicaciones.

Lo que podría estar sucediendo es que cuando se recicla un proceso de trabajo, a veces su aplicación es la primera en ser agregada, y algunas veces el Kentico CMS es el primero en ser agregado, y esto cambia la forma en que se resuelve ICSharpCode.SharpZipLib.

Cuando d o la actualización una o dos veces por casualidad, su aplicación se carga primero, lo que significa que funciona.

What is Application Pool in IIS and Asp.Net?

ACTUALIZACIÓN: Es el uso de un sitio Web (compilado en el primer acceso), o Project Web (pre-compilado en Visual Studio). Si es un sitio web, ¿podrías convertirlo a un proyecto web e intentarlo?

+0

Están todos implementados en el mismo sitio web, por lo que están seguros de que están usando el mismo grupo de aplicaciones ... :) –

1

creo que estaban en el camino correcto con la redirección de unión. Sin embargo, permítanme sugerir que en lugar de unirse a su aplicación en contra de la versión anterior, se intenta unir el ensamblado dependiente en contra de la versión más reciente.

Por lo general, obligando a la versión anterior es la peor opción, porque si bien podría fijar el conjunto depdenent, se puede inyectar errores de compatibilidad en el código que depende de la versión más reciente.

+0

No entiendo ... Yo * soy * vinculante con la versión más nueva ...? ¿O encontré algo mezclado en mi código allí? –

Cuestiones relacionadas