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
子文件夹。 删除此文件夹,然后重试。 所以这里是我遵循的步骤:
- 使用默认模板创build一个新的ASP.NET MVC 3项目
- 打开软件包pipe理器控制台窗口(查看 – >其他Windows – >软件包pipe理器控制台)
- 在命令行上input
install-package ninject.mvc3
- 将
Global.asax
的默认代码replace为问题中的代码 - 删除在安装软件包期间创build的
AppStart
子文件夹 - 运行应用程序
- 享受在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),则要在发布中单击此框以删除旧文件