Ninject在appharbor上启动应用程序时崩溃

本文关键字:应用程序 崩溃 启动 appharbor Ninject | 更新日期: 2023-09-27 18:30:10

我在appharbor上部署的MVC 3项目中使用Ninject。我注意到,当应用程序启动时,我遇到了一个异常,看起来Ninject内部的某些东西是原因,但我找不到任何答案,所以请帮助我:)

将尝试在此处添加完整的异常:

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");

Ninject在appharbor上启动应用程序时崩溃

问题不是由Ninject引起的。罪魁祸首是NewRelic.AgentSim(AppHarbor使用)。

尽管查看了stacktrace,但我认为您可以通过禁用Ninject的自动扩展加载功能并手动加载来解决这个问题。

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

我们暂时禁用了New-Reic插件,并从AppHarbor服务器中删除了New-Retic代理。一旦NewRelic不再给平台上运行的应用程序带来问题,我们将重新添加它。