2009-04-20 37 views
6

Ok, estoy teniendo un problema muy extraño al implementar una de nuestras aplicaciones web en nuestros servidores activos.No se pudo cargar el archivo o el ensamblado 'log4net

Nuestra aplicación utiliza log4net para registrar un montón de acciones bastante y después de un par de horas después de su implementación obtenemos la siguiente excepción.

No se pudo cargar el archivo o ensamblado 'log4net, Version = 1.2.9.0, Culture = neutral, PublicKeyToken = b32731d11ce58905' o una de sus dependencias. Acceso denegado.

Aquí están las adiciones web.config relevantes que uso.

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

Está funcionando bien en nuestras máquinas locales un servidor de desarrollo pero no en vivo.

Incidentalmente parece que se rompe después de que el compilador JIT se ejecuta en el servidor después de una actualización web.config o un reciclado de un grupo de aplicaciones, ¡o incluso por un período de tiempo prolongado!

ACTUALIZACIÓN: Nuestros servidores en vivo ejecutan todos los sitios web desde una ubicación compartida. Pude replicar este problema en otro servidor que ejecuta la aplicación desde un recurso compartido. Al configurar el sitio para que se ejecute desde un disco local, el problema desaparece, pero nuestro alojamiento requiere que ejecutemos desde un recurso compartido. Alguna idea de por qué log4net tendría problemas de permisos ejecutándose desde un recurso compartido. De nuevo, la aplicación se ejecuta por primera vez hasta que otra compilación JIT se produce

+0

tengo exactamente el mismo problema que usted. ¿alguna vez obtuviste una solución para esto? – gabe

Respuesta

1

Comprobar la versión que ates en tiempo de compilación (su referencia de archivo) y la versión que se utiliza en tiempo de ejecución (mirar primero en la GAC, entonces local)

Por lo general, la versión en el GAC difiere de la versión que tiene como referencia de archivo. Por favor, chequee esto.

también la limpieza del directorio temporal y ejecutar ASP.NET reinicio de IIS (CMD pedirá -> iisreset)

+0

Pero si no hacemos referencia al GAC, solo hacemos referencia al dll. Tal vez mi comprensión del GAC es incorrecta? – Sheff

+0

Los ensamblados de referencia siempre son tiempo de compilación, GAC siempre es tiempo de ejecución. Haga clic en el conjunto al que se hace referencia en su proyecto de C#. Mira la firma. Luego busque en el GAC, verifique si el nombre del ensamblado está registrado allí. De ser así, verifique ambas versiones (la que mencionó y la que está en el GAC). Cuando difieren tiene un problema –

5

pidiendo Probally lo obvio, pero estoy asumiendo la log4net.dll en la carpeta bin es la versión correcta?

si tiene más de un proyecto que hace referencia a versiones diferentes de la misma DLL no es raro que el proyecto posterior copie la DLL sobre la versión anterior.

Suponiendo que tiene que admitirse más de una copia de log4net, la mejor solución que puedo pensar es agregar una sonda a su configuración y poner esta versión en otra carpeta.

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

+0

Eso es interesante. Tenemos varios proyectos ejecutándose en ese servidor usando log4net. Estoy bastante seguro de que usan la misma versión, intentaré tu sugerencia. Aún así, ¿por qué funcionaría el proyecto desde un disco local pero no desde un recurso compartido? – Sheff

+0

Un recurso compartido es solo una ubicación parcialmente confiable. Puede agregarlo para tener plena confianza. Olvidé el nombre del símbolo del sistema pero hay un complemento mmc ".NET Framework 2.0 Configuration" que puede configurarlo para usted. ¿Puede confirmar que la versión de log4net en su carpeta bin es la versión 1.2.9.0 y que la clave pública es correcta? puede hacer clic derecho en el archivo y elegir propiedades para descubrir. –

+0

Aunque no utilicé log4net.dll como referencia, estaba en mi carpeta bin. Una vez eliminado, ya no recibí el error 500 ... – Cerveser

8

Hemos tenido este problema también cuando nos mudamos a VS 2010 y .NET 4.0, no utilizamos log4net en absoluto, pero sospecho algo más que utilizamos hace (tal vez Crystal Reports?) Y yo También sospecho que hay un dll que usamos que también es un dll de 32 bits porque cuando cambio la opción "Habilitar aplicaciones de 32 bits" en la configuración avanzada para el grupo de aplicaciones en IIS a "Verdadero", todo funcionó de nuevo.

+0

Gracias. Solo estaba teniendo este problema y tu respuesta me ayudó. Pero, curiosamente, tuve el problema opuesto. Tenía "Habilitar aplicaciones de 32 bits" establecido en "Verdadero", y comenzó a funcionar nuevamente cuando lo configuré en "Falso". – Bob

+0

Nota: Por el comentario de Matt. Crystal Reports llamaba a log4net. –

0

Apuesto a que su compilador JIT no tiene acceso de escritura para compartir. Parece que el compilador JIT recompila todo el sitio de vez en cuando, tal vez cuando se recicla.

Una de las opciones es desplegar el sitio previamente creado. De esa manera no hay recompilación. La otra opción es que otorgue acceso de escritura al compilador JIT a su recurso compartido. Es probable que sea el mismo usuario que ejecuta su servicio web, por ej.SISTEMA, SERVICIO DE RED o grupos de SERVICIO LOCAL o tal vez uno de los usuarios de IIS_ * ...

Cuestiones relacionadas