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

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

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

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(),从而抛出exception。

我究竟做错了什么?

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

  1. 使用默认模板创build一个新的ASP.NET MVC 3项目
  2. 打开软件包pipe理器控制台窗口(查看 – >其他Windows – >软件包pipe理器控制台)
  3. 在命令行上inputinstall-package ninject.mvc3
  4. Global.asax的默认代码replace为问题中的代码
  5. 删除在安装软件包期间创build的AppStart子文件夹
  6. 运行应用程序
  7. 享受在Google Chrome浏览器中打开的/Home/Index默认页面的美丽:-)

我必须补充一点,希望别人能够更快地解决这个问题,而不是像我几乎那样想把头发上的每一根头发都拔掉。

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

通过重命名生成的程序集,我们编译时会创build一个新文件名。 但是,旧名称的旧文件仍然在bin目录中! 如果Ninject通过App_Start中添加的类激活,那么这个激活类将在BOTH程序集(旧的和新的重命名的)中被调用。 不要问我如何或为什么,但它确实会给你这个“已经初始化”的错误。

甚至没有清洁解决scheme的作品,因为Visual Studio只会删除它生成的二进制文件,这将是新的重命名的。 只留下那些老人坐在那里。

在尝试做其他事情之前删除您的bin文件夹! 我希望这可以节省别人浪费宝贵的工作时间!

我已经更新了在您的问题中链接的文档Wiki,以显示如何设置MVC3应用程序。 我build议使用第二个选项,它是NuGetpackage的首选方式。

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

正如Alex Ford所说:

我必须补充一点,希望别人能够更快地解决这个问题,而不是像我几乎那样想把头发上的每一根头发都拔掉。

我有一个特殊的版本,可以解决这个问题,如下所示:

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

此错误是由于有2个项目与App_Start / NinjectWebCommon.cs

删除文件消除了错误。

注意:如果您因为需要为您的类库项目之一引用Ninject.Web.Common程序集而获取Ninject.Web.Common,则可以安全地删除“App_Start”文件夹和“NinjectWebCommon.cs”。 这是为web / web api项目。

>点击这里查看原始博客条目<

我的解决scheme是,我已经将App_Start文件夹属性Namespace Provider设置为True。

我已经把它改成了False,这样Resharper就不会突出显示与文件夹结构不匹配的名称空间。

想要添加一个原因…

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

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

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

发布到azure截图