2011-11-03 86 views
5

編輯:正如Kirk Woll正確指出的那樣,問題是NLog,而不是NInject。因此,讓我改一下這個問題:NLog在發佈模式下IIS7失敗

EDIT2:現在,我知道這是NLOG +一個IoC的問題,我發現在ASP.NET MVC2 + Ninject + NLog (+ shared hosting?) = NullReferenceException

的解決方案,我有一個使用NInject通過注入的NLogger類項目ILogger接口進入我的所有控制器。史蒂文,回答你的問題,以保持我的web.config清潔,我已經使用NLog.Config文件分開了該配置。

當我在調試模式下的IIS7的目標,代碼工作正常,但在釋放模式下,我得到下面的堆棧跟蹤。

如果任何人有任何想法,爲什麼在調試模式下的代碼將工作,爲什麼在發佈它不會,它將不勝感激。我還在下面列出了我的NLog配置文件。

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

堆棧跟蹤:

[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

嗯,這個錯誤顯然在'NLog.LogManager.GetCurrentClassLogger()'中。你有這個方法的來源,你可以發佈它嗎? –

+0

您是否在配置文件中配置了NLog?也許是'HttpModule'?在這種情況下,對於IIS7,你需要在''標籤中配置東西。 – Steven

回答

1

好了,我花了排查和解決問題2夜。最初我認爲這個問題與NLog日誌框架有關,所以我轉而使用Log4Net。這很簡單,因爲我使用了Ninject.Extensions.Logging。但是這沒有幫助。

然後我更新到Ninject的預發佈版本,異常消息變得更加清晰:「無法確定DynamicInjectorb709a37f02d44e5a8615c5fde4e0746d的當前類」。

最後一些谷歌上搜索向我指出下面的討論:https://groups.google.com/forum/#!msg/ninject/V_bS0ykJxAA/IBnsGVnL50UJ

解決方案:

1

我也經歷過類似的「通過創建具有UseReflectionBasedInjection設置爲true的NinjectSettings實例內核嘗試使用反射,而不是」問題。

我的(簡單的)溶液:

通過此線

private static Logger Logger = LogManager.GetCurrentClassLogger(); 

的 「只讀」 關鍵字是可選的替換這些行

private Logger Logger = LogManager.GetCurrentClassLogger();