【问题标题】:Ninject MVC3 - bootstrapper throwing "Already Initialized" exceptionNinject MVC3 - 引导程序抛出“已经初始化”异常
【发布时间】:2011-08-20 02:28:45
【问题描述】:

我创建了一个空的 Asp.Net MVC3 项目,并使用了 nuget install-package Ninject.MVC3

没有做任何其他事情(没有注册服务,甚至没有创建控制器)我运行应用程序。

项目在 NinjectMVC3.cs 的第 22 行中断,但有以下例外:

[InvalidOperationException:已经初始化!] C:\Projects\Ninject\Maintenance2.2\ninject.web.mvc\mvc3\src\Ninject.Web.Mvc\Bootstrapper.cs> 中的 Ninject.Web.Mvc.Bootstrapper.Initialize(Func`1 createKernelCallback):58 C:\Projects\Events\Events\App_Start\NinjectMVC3.cs:22 中的 Mvc.App_Start.NinjectMVC3.Start()

[TargetInvocationException:异常 被一个目标抛出 调用。]
System.RuntimeMethodHandle._InvokeMethodFast(IRuntimeMethodInfo 方法,对象目标,对象[] 参数,SignatureStruct& sig, 方法属性方法属性, RuntimeType typeOwner) +0
System.RuntimeMethodHandle.InvokeMethodFast(IRuntimeMethodInfo 方法,对象目标,对象[] 参数,签名签名, 方法属性方法属性, RuntimeType typeOwner) +72
System.Reflection.RuntimeMethodInfo.Invoke(对象 obj、BindingFlags、invokeAttr、Binder 活页夹,Object[] 参数, CultureInfo 文化,布尔值 跳过可见性检查)+335
System.Reflection.RuntimeMethodInfo.Invoke(对象 obj、BindingFlags、invokeAttr、Binder 活页夹,Object[] 参数, CultureInfo 文化)+28
System.Reflection.MethodBase.Invoke(对象 obj, Object[] 参数)+19
WebActivator.BaseActivationMethodAttribute.InvokeMethod() +199 WebActivator.ActivationManager.RunActivationMethods() +330 WebActivator.ActivationManager.RunPreStartMethods() +27 WebActivator.ActivationManager.Run() +39

NinjectMVC3.cs 中的行是:

public static void Start() 
        {
            DynamicModuleUtility.RegisterModule(typeof(OnePerRequestModule));
            DynamicModuleUtility.RegisterModule(typeof(HttpApplicationInitializationModule));
            bootstrapper.Initialize(CreateKernel); // <- this one right here...
        }

这是怎么回事?我在其他项目中使用 Ninject for MVC3 完全没有问题。我确实注意到 Start() 方法中的第二行不包含在 Ninject.MVC3 的旧(几周)包中,所以最近的更新中可能还有其他问题?

请帮忙!

编辑以解决来自 Remo 的答案

这是来自我的 global.asax.cs

 public class MvcApplication : System.Web.HttpApplication
 {

global.asax 也是 100% 标准的。未进行任何调整。

编辑 - 问题消失了...

老实说,我不知道是什么原因造成的,但是在几次重新启动 Visual Studio 并完全重新启动后,该项目可以正常运行。我也不能在新项目中重现问题。

抱歉浪费您的时间:)

【问题讨论】:

  • 不太确定如何处理这个问题,因为可能没有正确答案。我是标记它,关闭它还是什么?
  • 您可以选择最有帮助的答案,也可以自己回答并详细说明您所做的事情(本质上是您的编辑)。看起来很奇怪,但这就是通常的处理方式。

标签: c# .net asp.net-mvc-3 ninject


【解决方案1】:

看看Setting up a MVC3-application

简而言之:

您可能在您的项目中找到了带有NinjectMVC3.cs 文件的App_Start 文件夹。

当使用 NuGet 包并修改 Global.asax(没有理由)时,您必须删除 App_Start 文件夹并删除对 WebActivator 和 Microsoft.Web.Infrastructure 的引用

【讨论】:

  • 我正要删除 NuGet 文件,但这就像一个魅力。
  • 哇!只是为了让 Ninject 工作,这是多么令人沮丧的经历!
【解决方案2】:

当我更改项目的命名空间,然后再次切换回来时,我遇到了这种情况。

即使我清理了解决方案并执行了 iisreset,它返回时显示“已初始化”。

问题来自于我更改命名空间并构建项目时在 bin 目录中创建的 dll - 在更改命名空间并清理解决方案后,来自备用命名空间的 dll 仍然存在,因此正在在 Web 应用程序启动时加载,导致“已初始化”错误。

删除 dll 解决了这个问题。

【讨论】:

  • 这个!我只花了两个小时试图弄清楚我到底做了什么。我重命名了所有命名空间,包括构建的命名二进制文件,然后突然 ninject 开始尖叫。我最终得到了 bin 文件夹中的旧二进制文件和新的二进制文件。 ninject 的两个 webactivator 都被调用了。干净的解决方案不起作用,因为它只会清理它生成的二进制文件,并且因为我重命名了所有内容,所以它不认为那些旧的二进制文件有任何问题。现在去删除你的 BIN 和 OBJ 文件夹,然后用披萨和啤酒来庆祝吧。
【解决方案3】:

您很可能从 NinjectHttpApplication 派生并同时使用 AppStart。这两种方式不应混为一谈。

阅读文档https://github.com/ninject/ninject.web.mvc/wiki/Setting-up-an-MVC3-application

【讨论】:

  • 请查看我的更新。我实际上不是...如果您指的是在 MVC 中使用 Ninject 的“旧”方式,您在 global.asax.cs 中派生了 MvcApplication?
  • 嗯,很奇怪。我刚刚检查过,我没有问题。如果 bootstrapper.Initialize(CreateKernel) 被调用两次,则会引发此异常。如果 Start 方法执行两次,您可能需要调试。
  • 你能再扩大一点吗。给出正确的代码示例将是王牌。
  • 我之前已经更新了 Doc monts。阅读github.com/ninject/ninject.web.mvc/wiki/…
【解决方案4】:

我最近遇到了同样的问题。就我而言,我的解决方案中有多个项目......而且其中一个项目包含对 Ninject.MVC3 的 NuGet 包引用。

当我更新所有 Ninject 包版本时,App_Start 文件夹会在所有具有 NuGet 引用的项目上创建。所以,我不得不从类库项目中删除 App_Start 文件夹;只需将 App_Start 文件夹留在主 MVC 应用程序上即可。

【讨论】:

  • 是的,请注意类库项目引用中不需要的 App_Start 文件夹!
【解决方案5】:

我不确定是什么导致了您的应用程序被炸毁,但我很高兴 VS 重新启动解决了它。我发生了同样的错误,但无论我做了多少次清理/重建或重新启动 VS 多少次,我都无法纠正它。

最终为我工作的是完全删除 Ninject MVC NuGet 包,只需添加 Ninject 和 Ninject dll 的老式方式。我认为他们的 NuGet 包可能有问题。

我希望这对其他人有帮助,当我只需要转储 NuGet 包时,我浪费了几个小时。

【讨论】:

    【解决方案6】:

    问题消失了……

    老实说,我不知道是什么原因造成的,但是在几次重新启动 Visual Studio 并完全重新启动后,该项目可以正常运行。我也不能在新项目中重现问题。

    抱歉浪费您的时间:)

    更新

    自从发布此答案以来,已经出现了一些好的答案。我正在更新此答案以在一个答案中收集不同的方法。希望你们没问题:

    DevilDog74已回复

    最后我去了 gitub 并克隆了一个 新的 repo,下载了最新的 Ninject.Web.Common 和最新的 Ninject2 发布构建并进行本地发布 建造。 然后我放弃了 nuget 包,并对新编译的程序集“Ninject”、“Ninject.Web.Common”和“Ninject.Web.Mvc”进行了程序集引用,我的项目开始了 > 正在创建控制器,它们的依赖项是解决了。​​

    Jeff Circeo已回复

    我通过下载解决了这个问题 从 https://github.com/ninject/ninject.web.mvc 而不是使用 nuget 包。一世 在我之后不需要做任何事情 添加了引用。

    Marcus King已回复

    最终对我有用的是 删除 Ninject MVC NuGet 包 完全,只需添加 Ninject Ninject dll 是老式的 大大地。我想可能有什么 他们的 NuGet 包有问题。

    【讨论】:

    • FYI,当我在我的项目中做了一堆重命名并且我没有做一个“干净的解决方案”时,我也得到了这个错误(实际上我做了,但它没有工作第一个时间)。结果是旧的 DLL 仍然存在于 bin 目录中,它们也在以某种方式初始化 Ninject!
    【解决方案7】:

    阅读文档!

    https://github.com/ninject/ninject.web.mvc/wiki/Setting-up-an-MVC3-application

    这些方法有什么区别?

    两种方法完全相同。他们将 Ninject 挂接到 MVC 应用程序中。唯一的区别是他们使用不同的方法来做到这一点。使用不同方法的原因是 NuGet 包可以通过添加一个文件来提供开箱即用的集成。否则将需要对 global.asax 进行复杂的修改

    注意:如果您决定在使用 NuGet 包时采用第一种方法(没有理由),您必须删除 App_Start 文件夹并删除对 WebActivator 和 Microsoft.Web.Infrastructure 的引用。

    【讨论】:

      【解决方案8】:

      当我将 Ninject.Web.MVC3 包升级到版本 2.2.2.0 时,我遇到了同样的问题。我注意到此更新在我的 .csproj 文件中添加了以下行(VCS FTW!):

      <Compile Include="App_Start\NinjectMVC3.cs" />
      

      将该文件的构建操作从编译更改为内容解决了我的问题。毕竟 App_Start 和 App_Code 一样邪恶……

      【讨论】:

        【解决方案9】:

        我通过手动删除 /bin 文件夹中的一些 dll 解决了这个问题,这些 dll 在从 Visual Studio 运行 Cleanup 命令时没有被删除。

        【讨论】:

          【解决方案10】:

          我有同样的问题,我从 NinjectHttpApplication 继承并覆盖 OnApplicationStarted 的一些细微差别。 我通过从https://github.com/ninject/ninject.web.mvc 下载而不是使用 nuget 包解决了这个问题。

          添加引用后,我无需执行任何操作。

          【讨论】:

            【解决方案11】:

            我花了大约 4 个小时来处理 nuget 包,但无济于事。

            最后我去了 gitub 并克隆了一个新的 repo,下载了最新的 Ninject.Web.Common 和最新的 Ninject2 发布版本并进行了本地发布版本。

            然后我放弃了 nuget 包,并对新编译的程序集“Ninject”、“Ninject.Web.Common”和“Ninject.Web.Mvc”进行了程序集引用,我的项目开始工作,并且正在使用它们的依赖项创建控制器正在解决。

            这就是我的代码的样子,但我认为 nuget 包中也可能存在问题...

            public class MvcApplication : NinjectHttpApplication
            {
                protected override void OnApplicationStarted()
                {
                    base.OnApplicationStarted();
            
                    AreaRegistration.RegisterAllAreas();
                    RegisterGlobalFilters(GlobalFilters.Filters);
                    RegisterRoutes(RouteTable.Routes);
                }
            
                protected override Ninject.IKernel CreateKernel()
                {
                    // declaratively add the Ninject Modules that we have built to manage our dependencies...
                    var modules = new INinjectModule[]{
                        new RepoModule()
                    };
            
                    return new StandardKernel(modules);
                }
            
                public static void RegisterGlobalFilters(GlobalFilterCollection filters)
                {
                    filters.Add(new HandleErrorAttribute());
                }
            
                public static void RegisterRoutes(RouteCollection routes)
                {
                    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
            
                    routes.MapRoute(
                        "Default", // Route name
                        "{controller}/{action}/{id}", // URL with parameters
                        new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
                    );
            
                }
            }
            

            【讨论】:

              【解决方案12】:

              确保只有一个程序集有“NinjectMVC3”类,如果a.dll,b.dll都在bin目录下有NinjectMVC3类,就会出现这样的错误!

              【讨论】:

                【解决方案13】:

                我刚刚遇到了同样的问题,我意识到这是因为 NuGet 将 NinjectMVC3.cs 文件添加到了我的 Web 应用程序和我的 DAL 库中。没有意识到发生了这种情况,但是一旦我从 DAL 库中删除了该文件,它就很好了。

                【讨论】:

                  【解决方案14】:

                  当您使用 nuGet 时,会创建一个文件夹 App_start,请查看它。

                  【讨论】:

                    【解决方案15】:

                    我将添加这个作为答案只是因为我还没有看到有人提到它,并且在开始克隆 repos 之前值得检查一下。

                    我在一个可能包含 15 个项目的解决方案中突然遇到了这个问题,其中三个是网站。当我开始遇到这个问题时,我一直在其中一个站点上工作,而我没有更改任何明显会导致问题的东西:我没有在任何地方添加 Ninject(它已经安装并且工作正常),全局 asax 文件是不是从 Ninject 类派生的,并且任何 App_Start 文件夹中都没有任何问题。

                    在对 NuGet 等进行了相当多的处理后无济于事(由有关未解决引用的消息引起 - 似乎 Ninject 没有被正确引用,但确实如此),我浏览了我更改的所有文件特别注意项目和配置文件,并发现不知何故 Visual Studio 已将其他网站之一添加为对我尝试运行的网站的项目引用。结果 Ninject 配置运行了两次并导致问题,所以根本原因是相同的,但搞砸的方法不同。

                    没有理由引用该项目,它以前不存在,因为它不是有效的依赖项,我没有手动添加它,我仍然不知道它是如何发生的,但删除它立即解决了问题。

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 1970-01-01
                      • 2011-02-09
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2011-04-16
                      • 1970-01-01
                      相关资源
                      最近更新 更多