2012-04-04 59 views
13

我在部署在appharbor上的MVC 3项目上使用Ninject。我注意到当应用程序启动时出现异常,它看起来像Ninject内部的东西是原因,但我找不到任何答案 - 所以请帮助我:)Ninject在appharbor上的应用程序启动时崩溃

将尝试添加完整的异常这里:

Server Error in '/' Application. 

Object reference not set to an instance of an object. 

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.NullReferenceException: Object reference not set to an instance of an object. 

Source Error: 

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below. 

Stack Trace: 


[NullReferenceException: Object reference not set to an instance of an object.] 
    NewRelic.Agent.Core.AgentShim.GetTracer(String tracerFactoryName, UInt32 level, String metricName, String assemblyName, String className, String methodName, String argumentSignature, Object invocationTarget) +51 
    System.AppDomain.CreateDomain(String friendlyName, Evidence securityInfo, AppDomainSetup info) +99 
    Ninject.Modules.AssemblyNameRetriever.CreateTemporaryAppDomain() in c:\Projects\Ninject\ninject\src\Ninject\Modules\AssemblyNameRetriever.cs:68 
    Ninject.Modules.AssemblyNameRetriever.GetAssemblyNames(IEnumerable`1 filenames, Predicate`1 filter) in c:\Projects\Ninject\ninject\src\Ninject\Modules\AssemblyNameRetriever.cs:47 
    Ninject.Modules.CompiledModuleLoaderPlugin.LoadModules(IEnumerable`1 filenames) in c:\Projects\Ninject\ninject\src\Ninject\Modules\CompiledModuleLoaderPlugin.cs:81 
    Ninject.Modules.ModuleLoader.LoadModules(IEnumerable`1 patterns) in c:\Projects\Ninject\ninject\src\Ninject\Modules\ModuleLoader.cs:60 
    Ninject.KernelBase.Load(IEnumerable`1 filePatterns) in c:\Projects\Ninject\ninject\src\Ninject\KernelBase.cs:236 
    Ninject.KernelBase..ctor(IComponentContainer components, INinjectSettings settings, INinjectModule[] modules) in c:\Projects\Ninject\ninject\src\Ninject\KernelBase.cs:97 
    Ninject.KernelBase..ctor(INinjectModule[] modules) in c:\Projects\Ninject\ninject\src\Ninject\KernelBase.cs:57 
    Ninject.StandardKernel..ctor(INinjectModule[] modules) in c:\Projects\Ninject\ninject\src\Ninject\StandardKernel.cs:46 
    Checkin.App_Start.NinjectWebCommon.CreateKernel() in d:\temp\44uvjuob.32m\input\Checkin\App_Start\NinjectWebCommon.cs:43 
    Ninject.Web.Common.Bootstrapper.Initialize(Func`1 createKernelCallback) in c:\Projects\Ninject\Ninject.Web.Common\src\Ninject.Web.Common\Bootstrapper.cs:50 
    Checkin.App_Start.NinjectWebCommon.Start() in d:\temp\44uvjuob.32m\input\Checkin\App_Start\NinjectWebCommon.cs:26 

[TargetInvocationException: Exception has been thrown by the target of an invocation.] 
    System.RuntimeMethodHandle._InvokeMethodFast(IRuntimeMethodInfo method, Object target, Object[] arguments, SignatureStruct& sig, MethodAttributes methodAttributes, RuntimeType typeOwner) +0 
    System.RuntimeMethodHandle.InvokeMethodFast(IRuntimeMethodInfo method, Object target, Object[] arguments, Signature sig, MethodAttributes methodAttributes, RuntimeType typeOwner) +69 
    System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks) +242 
    System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) +21 
    System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters) +19 
    WebActivator.BaseActivationMethodAttribute.InvokeMethod() +223 
    WebActivator.ActivationManager.RunActivationMethods() +493 
    WebActivator.ActivationManager.RunPreStartMethods() +28 
    WebActivator.ActivationManager.Run() +55 

[InvalidOperationException: The pre-application start initialization method Run on type WebActivator.ActivationManager threw an exception with the following error message: Exception has been thrown by the target of an invocation..] 
    System.Web.Compilation.BuildManager.InvokePreStartInitMethods(ICollection`1 methods) +377 
    System.Web.Compilation.BuildManager.CallPreStartInitMethods() +267 
    System.Web.Hosting.HostingEnvironment.Initialize(ApplicationManager appManager, IApplicationHost appHost, IConfigMapPathFactory configMapPathFactory, HostingEnvironmentParameters hostingParameters, PolicyLevel policyLevel, Exception appDomainCreationException) +690 

[HttpException (0x80004005): The pre-application start initialization method Run on type WebActivator.ActivationManager threw an exception with the following error message: Exception has been thrown by the target of an invocation..] 
    System.Web.HttpRuntime.FirstRequestInit(HttpContext context) +532 
    System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context) +90 
    System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr, HttpContext context) +172 

Version Information: Microsoft .NET Framework Version:4.0.30319; ASP.NET Version:4.0.30319.272 

如果我重新加载页面 - 异常消失。 这可能有些事情要使用ninject一个过滤器:

this.BindFilter<AdminAuthorizationAttribute>(FilterScope.Controller, -100) 
    .When((context, ad) => context.RouteData.DataTokens["area"] != null && 
      ((string)context.RouteData.DataTokens["area"]).ToLower() == "admin" && 
      ((string)context.RouteData.Values["controller"]).ToLower() != "login"); 
+0

即使我一直对此感到困惑。是什么让你认为它的Ninject正在崩溃?如果你拿出过滤器,它会消失吗? – Mrchief 2012-04-04 14:55:53

+0

也收到此错误。也可能是新的遗物,因为我在appharbor和装有新文物的Windows 2008服务器上都得到了这个。 ninject 2.2和3.0都有。 – terjetyl 2012-04-04 17:13:44

+0

从堆栈跟踪('NewRelic.Agent.Core.AgentShim.GetTracer')看起来NewRelic是造成这个问题的原因... – nemesv 2012-04-04 18:53:30

回答

13

的问题不是由Ninject造成的。它是NewRelic.Agent.Core.AgentShim(由AppHarbor使用),是罪魁祸首。

虽然看着堆栈跟踪,我想你可以通过禁用Ninject的自动extenison加载功能并手动加载它们来解决这个问题。

var kernel = new StandardKernel(new NinjectSettings { LoadExtensions = false }) 
kernel.Load(new Ninject.Web.Mvc.MvcModule()); // same for all other extension modules 
+0

我曾试过这个,但它没有解决我的问题。即使LoadExtensions = false – 2012-04-09 19:42:52

+0

@JessChadwick,我仍然会遇到异常,这仅仅是问题中堆栈跟踪的解决方法。如果完全按照上面的方式完成,它将解决该堆栈跟踪。要么你有一个不同的问题,或者你在创建内核之后将LoadExtension设置为false(kernel.Settings.LoadExtensions = false)。这不起作用。如果您有其他问题,则可能需要等到AppHarbor解决问题。 – 2012-04-09 21:57:27

+0

@RemoGloor,nope - 我已经得到完全相同的堆栈跟踪,并像上例中那样设置LoadExtensions属性。看起来我只需要等AppHarbor修复。 – 2012-04-10 13:38:23

1

我们已经暂时禁用了New Relic插件并从AppHarbor服务器中删除了New Relic代理。一旦它不再对平台上运行的应用程序造成问题,我们将重新添加New Relic。