【问题标题】:Ninject + MVC3 = InvalidOperationException: Sequence contains no elementsNinject + MVC3 = InvalidOperationException:序列不包含任何元素
【发布时间】:2015-12-08 00:16:32
【问题描述】:

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

然后我使用 NuGet 获取Ninject.MVC extension。我根据 Ninject 文档修改了我的 global.asax,How To Setup an MVC3 Application

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 行。

果然,line 67 of that file 调用了 .Single(),从而引发了异常。

我做错了什么?

【问题讨论】:

    标签: asp.net-mvc-3 ninject


    【解决方案1】:

    我必须补充一点,希望其他人能更快地解决问题,而不是像我几乎一样拔掉他们头上的每一根头发。

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

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

    甚至清理解决方案都不起作用,因为 Visual Studio 只会删除它生成的二进制文件,这将是新重命名的二进制文件。它让老人们独自坐在那里。

    在您尝试做任何其他事情之前,请先删除您的 bin 文件夹!我希望这可以避免其他人浪费宝贵的工作时间!

    【讨论】:

    • 好吧,我已经浪费了大约 40 分钟才发现你的答案。谢谢亚历克斯!
    • 接受的答案并没有为我做,但这个答案做了。谢谢亚历克斯。
    • 非常感谢!我在这个问题上烧了一个小时,如果没有你的回应,我会烧更多。这应该是对相应问题的正确答案。
    • 太棒了!谢谢亚历克斯。我浪费了很多时间试图弄清楚这一点,您的解决方案非常有效。
    • 这太棒了。太感谢了。我正是这样做的,一个完整的命名空间重命名,甚至没有将我的问题归因于程序集仍然构建在 bin 中的事实。非常感谢!
    【解决方案2】:

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

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

    【讨论】:

    • 那行得通。我不知道为什么。我不喜欢在不理解的情况下修复错误......但是谢谢,这让我解开了。
    • 这不是错误。 NuGet 包仅使用另一种方式来设置内核,因此它不必更改 global.asax。您的应用程序同时使用了两种方式,这使扩展程序在启动两次时处于无效状态。
    • 谢谢你的有用解释,雷莫。
    • 在不删除 App_Start 文件夹的情况下解决此问题的正确方法是什么?
    • @Kyralessa,让 Global.asax 保持原样(不是从 NinjectHttpApplication 派生)并在 ~/App_Start/NinjectMVC3.cs 文件中配置内核(RegisterServices 方法)。
    【解决方案3】:

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

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

    【讨论】:

    • 非常有帮助,雷莫。既然我已经标记了一个答案,我只会投票给你,也许还会投票给你的其他几个人。感谢您在回答和更新 Wiki 方面做出的贡献。
    【解决方案4】:

    正如亚历克斯·福特所说:

    我必须补充一下,希望其他人能解决这个问题 发的更快不想拔掉每一根头发 他们的头就像我几乎一样。

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

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

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

    删除文件可消除错误。

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

    >click here to view the original blog entry<

    【讨论】:

    • 在更改了我的项目的命名空间后,我今天再次遇到了同样的问题。这里的所有解决方案都没有帮助。清洁和重建没有帮助。但有帮助的是删除我项目的 bin 和 obj 文件夹。似乎仍然有一些旧的命名空间部分没有被清理删除。
    • 嗨,Da_Wolf,就是这样。谢谢你。你解决了我的问题
    【解决方案5】:

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

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

    【讨论】:

    • 这是给我的,快把我逼疯了。
    【解决方案6】:

    想再补充一个原因...

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

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

    【讨论】:

    • 是的!就是这样!我错误地在另一个项目上添加了第二个 Ninjectwebcommon.cs 文件!就是这样(使用 MVC 5)
    【解决方案7】:

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

    【讨论】:

    • 这是我要发布的完全相同的图片!我希望我已经向下滚动到这个答案,但上面的答案让我想到了这个想法。 +1
    猜你喜欢
    • 2015-02-19
    • 2014-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-07
    • 2014-12-25
    • 2012-12-17
    • 1970-01-01
    相关资源
    最近更新 更多