2011-11-03 15 views
5

EDYCJA: Jak słusznie zauważył Kirk Woll, problem dotyczy NLog, a nie NInject. Więc pozwól mi przeformułować problem:NLog Błąd w trybie wydawania w IIS7

Edit2: Teraz, kiedy wiedział, że NLog + an problemem IoC, znalazłem rozwiązanie w ASP.NET MVC2 + Ninject + NLog (+ shared hosting?) = NullReferenceException

Mam projektu, który używa NInject wstrzyknąć klasy NLogger poprzez Interfejs ILogger do wszystkich moich kontrolerów. Steven, aby odpowiedzieć na twoje pytanie, aby mój web.config był czysty, użyłem pliku NLog.Config, aby oddzielić tę konfigurację.

Kiedy celuję w IIS7 w trybie debugowania, kod działa poprawnie, ale w trybie wydania otrzymuję poniższy ślad stosu.

Jeśli ktoś ma jakiś pomysł, dlaczego w trybie debugowania kod zadziała, i dlaczego w wersji nie byłoby, byłoby to bardzo cenne. Mam również mój plik konfiguracji NLog poniżej.

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

stosu Ślad:

[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

Cóż, błąd jest oczywiście w 'NLog.LogManager.GetCurrentClassLogger()'. Czy masz źródło tej metody i czy możesz ją opublikować? –

+0

Czy skonfigurowałeś NLog w pliku konfiguracyjnym? Być może "HttpModule"? W takim przypadku dla IIS7 musisz skonfigurować elementy w tagu '". – Steven

Odpowiedz

1

Cóż, spędzam 2 noce na badania i rozwiązywania problemu. Początkowo myślałem, że problem związany z ramką logowania NLog, więc zamiast tego przełączyłem się na Log4Net. To było łatwe, ponieważ użyłem Ninject.Extensions.Logging. Ale to nie pomogło.

Następnie zaktualizowałem wersję wstępną do wersji Ninject i komunikat wyjątku stał się bardziej przejrzysty: "Nie można określić bieżącej klasy dla DynamicInjectorb709a37f02d44e5a8615c5fde4e0746d".

Wreszcie niektóre googling wskazał mnie do dalszej dyskusji: https://groups.google.com/forum/#!msg/ninject/V_bS0ykJxAA/IBnsGVnL50UJ

Rozwiązanie: „Spróbuj użyć refleksji zamiast tworząc jądro z instancji NinjectSettings który ma UseReflectionBasedInjection wartość true”

1

doświadczyłem podobnego problem.

My (uproszczone) rozwiązanie:

zastąpić te linie

private Logger Logger = LogManager.GetCurrentClassLogger(); 

przez tę linię

private static Logger Logger = LogManager.GetCurrentClassLogger(); 

W "tylko do odczytu" Hasło jest opcjonalne.

Powiązane problemy