2011-11-03 8 views
5

EDITAR: Como señaló correctamente Kirk Woll, el problema es NLog, no con NInject. Así que déjeme reformular la cuestión:NLog falla en el modo de liberación en IIS7

Edit2: Ahora que sabía que era Nlog + un problema de la COI, he encontrado la solución a ASP.NET MVC2 + Ninject + NLog (+ shared hosting?) = NullReferenceException

Tengo un proyecto que está utilizando ninject para inyectar una clase NLogger a través de una Interfaz ILogger en todos mis controladores. Steven, para responder a su pregunta y mantener mi web.config limpio, he usado un archivo NLog.Config para separar esa configuración.

Cuando selecciono IIS7 en modo de depuración, el código funciona correctamente, pero en el modo de lanzamiento obtengo el siguiente seguimiento de la pila.

Si alguien tiene alguna idea de por qué en el modo de depuración el código funcionaría, y por qué en el lanzamiento no lo haría, sería muy apreciado. También he incluido mi archivo de configuración NLog a continuación.

<?xml version="1.0"?> 
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <targets> 
    <target name="console" xsi:type="ColoredConsole" 
      layout="${date:format=HH\:mm\:ss}|${level}|${stacktrace}|${message}" /> 
    <target name="file" xsi:type="File" fileName="${basedir}/App_Data//Logs/site.log" 
      layout="${date}: ${message}" /> 
    <target name="eventlog" xsi:type="EventLog" 
      source="Template" 
      log="Application" 
      layout="${date}: ${message} ${stacktrace}" /> 
    </targets> 
    <rules> 
    <logger name="*" minlevel="Info" writeTo="file" /> 
    <logger name="*" minlevel="Fatal" writeTo="eventlog" />   
    </rules> 
</nlog> 

Seguimiento de la pila:

[NullReferenceException: Object reference not set to an instance of an object.] 
    NLog.LogManager.GetCurrentClassLogger() +84 
    DynamicInjectorc5f536e7a4564738b2e779e62f9c20c7(Object[]) +40 
    Ninject.Activation.Providers.StandardProvider.Create(IContext context) in c:\Projects\Ninject\Maintenance2.2\ninject\src\Ninject\Activation\Providers\StandardProvider.cs:81 
    Ninject.Activation.Context.Resolve() in c:\Projects\Ninject\Maintenance2.2\ninject\src\Ninject\Activation\Context.cs:157 
    Ninject.KernelBase.<Resolve>b__7(IContext context) in c:\Projects\Ninject\Maintenance2.2\ninject\src\Ninject\KernelBase.cs:375 
    System.Linq.<>c__DisplayClass12`3.<CombineSelectors>b__11(TSource x) +32 
    System.Linq.WhereSelectEnumerableIterator`2.MoveNext() +151 
    System.Linq.Enumerable.SingleOrDefault(IEnumerable`1 source) +4222965 
    Ninject.Planning.Targets.Target`1.GetValue(Type service, IContext parent) in c:\Projects\Ninject\Maintenance2.2\ninject\src\Ninject\Planning\Targets\Target.cs:179 
    Ninject.Planning.Targets.Target`1.ResolveWithin(IContext parent) in c:\Projects\Ninject\Maintenance2.2\ninject\src\Ninject\Planning\Targets\Target.cs:147 
    Ninject.Activation.Providers.StandardProvider.GetValue(IContext context, ITarget target) in c:\Projects\Ninject\Maintenance2.2\ninject\src\Ninject\Activation\Providers\StandardProvider.cs:97 
    Ninject.Activation.Providers.<>c__DisplayClass2.<Create>b__1(ITarget target) in c:\Projects\Ninject\Maintenance2.2\ninject\src\Ninject\Activation\Providers\StandardProvider.cs:81 
    System.Linq.WhereSelectArrayIterator`2.MoveNext() +85 
    System.Linq.Buffer`1..ctor(IEnumerable`1 source) +217 
    System.Linq.Enumerable.ToArray(IEnumerable`1 source) +78 
    Ninject.Activation.Providers.StandardProvider.Create(IContext context) in c:\Projects\Ninject\Maintenance2.2\ninject\src\Ninject\Activation\Providers\StandardProvider.cs:81 
    Ninject.Activation.Context.Resolve() in c:\Projects\Ninject\Maintenance2.2\ninject\src\Ninject\Activation\Context.cs:157 
    Ninject.KernelBase.<Resolve>b__7(IContext context) in c:\Projects\Ninject\Maintenance2.2\ninject\src\Ninject\KernelBase.cs:375 
    System.Linq.<>c__DisplayClass12`3.<CombineSelectors>b__11(TSource x) +32 
    System.Linq.WhereSelectEnumerableIterator`2.MoveNext() +151 
    System.Linq.Enumerable.SingleOrDefault(IEnumerable`1 source) +4222965 
    Ninject.Web.Mvc.NinjectDependencyResolver.GetService(Type serviceType) in c:\Projects\Ninject\Maintenance2.2\ninject.web.mvc\mvc3\src\Ninject.Web.Mvc\NinjectDependencyResolver.cs:56 
    System.Web.Mvc.DefaultControllerActivator.Create(RequestContext requestContext, Type controllerType) +51 

[InvalidOperationException: An error occurred when trying to create a controller of type 'BossP.Controllers.HomeController'. Make sure that the controller has a parameterless public constructor.] 
    System.Web.Mvc.DefaultControllerActivator.Create(RequestContext requestContext, Type controllerType) +182 
    System.Web.Mvc.DefaultControllerFactory.GetControllerInstance(RequestContext requestContext, Type controllerType) +80 
    System.Web.Mvc.DefaultControllerFactory.CreateController(RequestContext requestContext, String controllerName) +74 
    System.Web.Mvc.MvcHandler.ProcessRequestInit(HttpContextBase httpContext, IController& controller, IControllerFactory& factory) +232 
    System.Web.Mvc.<>c__DisplayClass6.<BeginProcessRequest>b__2() +49 
    System.Web.Mvc.<>c__DisplayClassb`1.<ProcessInApplicationTrust>b__a() +13 
    System.Web.Mvc.SecurityUtil.<GetCallInAppTrustThunk>b__0(Action f) +7 
    System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(Action action) +22 
    System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(Func`1 func) +124 
    System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, Object state) +98 
    System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext httpContext, AsyncCallback callback, Object state) +50 
    System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData) +16 
    System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +8963444 
    System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +184 
+1

Bueno, el error es obviamente en 'NLog.LogManager.GetCurrentClassLogger()'. ¿Tiene la fuente de ese método y puede publicarlo? –

+0

¿Ha configurado NLog en el archivo de configuración? Tal vez un 'HttpModule'? En ese caso, para IIS7 necesita configurar cosas en la etiqueta ''. – Steven

Respuesta

1

Bueno, paso 2 noches en la investigación y la solución del problema. Inicialmente pensé que el problema estaba relacionado con el marco de trabajo de registro de NLog, así que cambié a Log4Net. Eso fue fácil porque usé Ninject.Extensions.Logging. Pero eso no ayudó.

Luego actualicé a la versión preliminar de Ninject y el mensaje de excepción se hizo más claro: "No se puede determinar la clase actual para DynamicInjectorb709a37f02d44e5a8615c5fde4e0746d".

Finalmente algunas google me señaló a la siguiente discusión: https://groups.google.com/forum/#!msg/ninject/V_bS0ykJxAA/IBnsGVnL50UJ

Solución: "Trate de utilizar la reflexión no por la creación de un núcleo con una instancia NinjectSettings que tiene UseReflectionBasedInjection establece en true"

1

he experimentado un similares problema.

Mi solución (simplista):

reemplazar estas líneas

private Logger Logger = LogManager.GetCurrentClassLogger(); 

por esta línea

private static Logger Logger = LogManager.GetCurrentClassLogger(); 

La palabra clave "sólo lectura" es opcional.

Cuestiones relacionadas