Ninject + MVC3 = InvalidOperationException:序列不包含任何元素


90

我创建了一个新的MVC3项目,点击F5,看到了示例页面。

然后,我使用NuGet来获取Ninject.MVC扩展。我根据Ninject文档“ 如何设置MVC3应用程序”修改了global.asax :

public class MvcApplication : NinjectHttpApplication
{
   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 });
   }

   protected override IKernel CreateKernel()
   {
       var kernel = new StandardKernel();
       kernel.Load(Assembly.GetExecutingAssembly());
       return kernel;
   }

   protected override void OnApplicationStarted()
   {
       base.OnApplicationStarted();

       AreaRegistration.RegisterAllAreas();
       RegisterGlobalFilters(GlobalFilters.Filters);
       RegisterRoutes(RouteTable.Routes);
   }
}

现在,当我运行该应用程序时,除了以下例外,我得到了黄色的死亡屏幕:

InvalidOperationException-序列不包含任何元素。

在System.Linq.Enumerable.Single(...)

在Ninject.Web.Mvc.Bootstrapper.Initialize(...)第67行。

确实,该文件的第67行调用.Single(),从而引发异常。

我究竟做错了什么?

Answers:


101

您可能会注意到,在安装ninject.mvc3NuGet 之后,在App_Start项目内部创建了一个包含NinjectMVC3.cs文件的子文件夹。删除此文件夹,然后重试。所以这是我遵循的步骤:

  1. 使用默认模板创建一个新的ASP.NET MVC 3项目
  2. 弹出“程序包管理器控制台”窗口(查看->其他Windows->程序包管理器控制台)
  3. 键入install-package ninject.mvc3命令行
  4. 将默认代码替换为Global.asax问题中的代码
  5. 删除AppStart在软件包安装过程中创建的子文件夹
  6. 运行应用程序
  7. 享受/Home/Index在您的Chrome浏览器网络浏览器中打开的默认页面的美丽:-)

3
那行得通。我不知道为什么 我不喜欢在不了解错误的情况下修复错误...但是,谢谢,这使我不受阻。
Judah Gabriel Himango'3

19
这不是错误。NuGet软件包仅使用另一种方法来设置内核,从而不必更改global.asax。您的应用程序同时使用两种方式,都会在扩展程序启动两次时使其处于无效状态。
雷莫格洛尔

谢谢您的有用解释,雷莫。
Judah Gabriel Himango'3

4
删除App_Start文件夹的情况下解决此问题的正确方法是什么?
Ryan Lundy

12
@Kyralessa,保持原样的Global.asax(不是从派生NinjectHttpApplication),并在~/App_Start/NinjectMVC3.cs文件中配置内核(RegisterServices方法)。
Darin Dimitrov

120

我必须补充这一点,希望其他人能够更快地解决该问题,并且不想像我几乎那样拔掉头发上的每一缕头发。

我需要重命名项目中的所有内容以匹配新的业务术语。我到处更改了名称空间,甚至更改了程序集名称(右键单击项目>属性>应用程序选项卡),以使生成的程序集与新的命名约定匹配。程序集重命名使Ninject非常生气!

通过重命名要生成的程序集,我们在编译时会使用新名称创建一个新文件。但是,具有旧名称的旧文件仍位于bin目录中!如果您通过App_Start中添加的类激活了Ninject激活,那么该激活类将在两个程序集中都被调用(旧的和新的重命名的)。不要问我如何或为什么,但是这样做确实会给您带来“已初始化”错误。

甚至清理解决方案也行不通,因为Visual Studio仅会删除其生成的二进制文件,这些二进制文件将是新的重命名二进制文件。它让那些旧的仅坐在那里。

在尝试执行其他操作之前,请删除您的bin文件夹!我希望这可以避免其他人浪费宝贵的工作时间!


7
好吧,在我迷迷糊糊地回答您的问题之前,我已经浪费了大约40分钟。谢谢亚历克斯!
Maxim V. Pavlov '04年

3
接受的答案对我来说不是这样做的,但是这个回答对我有用。谢谢亚历克斯。
Pluc 2012年

2
非常感谢!我在这个问题上花了一个小时,如果没有您的回应,本来会花更多的时间。这应该是对适当问题的正确答案。
Doug

2
辉煌!谢谢亚历克斯。我浪费了很多时间试图深入了解这一点,因此您的解决方案运行完美。
Apogee 2014年

3
太棒了 非常感谢。我正是这样做的,对整个命名空间进行了重命名,甚至没有将我的问题归因于程序集仍然内置在bin中。非常感谢你!
David L

23

我已经更新了在您的问题中链接的文档Wiki,以显示设置MVC3应用程序的两种方法。我建议使用第二个选项,这是theNuGetpackage的首选方式。

而不是从NinjectHttpApplication派生,而是使用在安装软件包期间创建的AppStart文件夹中的NinjectMVC.cs。这也是创建内核,加载模块或定义绑定的位置。


非常有帮助,雷莫。由于我已经标记了答案,因此我只会投票给您,也许还会投票给您其他几个人。感谢您在回答和更新Wiki方面超越一切。
Judah Gabriel Himango'3

4

正如Alex Ford所说:

我必须补充这一点,希望其他人能够更快地解决该问题,并且不想像我几乎那样拔掉头发上的每一缕头发。

我有一个特殊版本的问题,可以通过以下方式解决:

异常详细信息:System.InvalidOperationException:序列不包含任何元素

此错误是由以下事实引起的:App_Start / NinjectWebCommon.cs有2个项目

删除文件可消除该错误。

注意:如果由于需要引用某个类库项目的Ninject.Web.Common程序集而正在获取Ninject.Web.Common,则可以安全地删除“ App_Start”文件夹和“ NinjectWebCommon.cs”。它适用于Web / Web API项目。

>点击此处查看原始博客条目<


更改项目的命名空间后,今天我又遇到了同样的问题。这里的所有解决方案都无济于事。清洁和重建无济于事。但是,有帮助的是删除了我项目的bin和obj文件夹。似乎仍然有一些旧的名称空间部分残留在其中,而这些部分并未通过清理而删除。
Wowe

嗨,Da_Wolf,就这样。谢谢。您解决了我的问题
VivekDev

2

我的解决方案是将App_Start文件夹属性Namespace Provider设置为True。

我已将其更改为False,以便Resharper不会突出显示与文件夹结构不匹配的名称空间。


对我来说就是这样,让我发疯。
rashleighp 2014年

2

想要增加一个原因...

我们将Ninject.MVC3软件包安装到了多个项目中-只有一个是实际的MVC应用程序。但是,我们忘记了删除App_Start文件夹。

从引用的项目中删除App_Start文件夹解决了此问题。


是的 就是这样!我错误地在另一个对象上添加了第二个Ninjectwebcommon.cs文件!就是这样(使用MVC 5)
何塞A

1

继续@Chev的回答...这也是我的最终问题。如果要部署到Azure网站(现在称为AppSite),则要单击发布中的此框以删除旧文件

发布到天蓝色截图


这与我要发布的图片完全相同!我希望我已向下滚动到此答案,但是以上答案将我引向了这个想法。 +1
Jess
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.