【问题标题】:Multiple types were found that match the controller named 'Home'找到了多种与名为“Home”的控制器匹配的类型
【发布时间】:2011-10-20 21:09:19
【问题描述】:

我目前在线托管了两个不相关的 MVC3 项目。

一个工作正常,另一个不工作,给我错误:

找到了与名为“Home”的控制器匹配的多种类型。这 如果服务此请求的路由可能会发生 ('{controller}/{action}/{id}') 未指定要搜索的命名空间 用于匹配请求的控制器。

如果是这样的话, 通过调用“MapRoute”方法的重载来注册此路由 这需要一个“命名空间”参数。

我的托管人的工作方式是他给我 FTP 访问权限,在那个文件夹中我还有两个文件夹,一个用于我的每个应用程序。

ftpFolderA2/foo.com

ftpFolderA2/bar.com

foo.com 工作正常,我将我的应用程序发布到我的本地文件系统然后 FTP 内容并且它工作正常。

当我上传并尝试运行 bar.com 时,会触发上述问题并阻止我使用我的网站。 尽管 foo.com 仍然有效

bar.com 是否在 ftpFolderA2 内的所有控制器中搜索,这就是它寻找另一个 HomeController 的原因?我怎样才能告诉它只在 Controller 文件夹中查看?

事实:

  1. 不使用区域。这是两个完全不相关的项目。我将每个已发布的项目放入每个相应的文件夹中。没什么特别的。
  2. 每个项目只有 1 个 HomeController。

有人可以确认这是问题所在吗?

【问题讨论】:

  • 非常不清楚的问题。你在使用区域吗?问题是否发生在本地?
  • @Darin:编辑了该信息。

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


【解决方案1】:

这是您可能遇到此错误的另一种情况。如果重命名项目以更改程序集的文件名,则可能有两个版本的 ASP.NET 程序集,这将重现此错误。

解决方案是转到您的 bin 文件夹并删除旧的 dll。 (我尝试了“重建项目”,但没有删除它们,所以一定要检查 bin 以确保它们已经消失)

【讨论】:

  • 此错误的其他变体是当您使用 resharper 并使用一些“自动”重构选项(包括名称空间名称更改)时。这就是发生在我身上的事。
  • 如果您从 Azure 应用服务获取此文件,请转到 https://.scm.azurewebsites.net/DebugConsole 登录并删除文件。
  • 谢谢这对我来说是个问题。我通过将现有项目复制/粘贴到新文件夹中来创建一个“新”项目;旧的构建 dll 附带,删除 bin 文件夹将其擦除干净
  • 我在将项目文件移动到第二个驱动器时遇到了这个问题。清除 bin 文件夹即可解决。最奇怪的事情。
  • 嗯,这是一个令人痛苦的恼人错误,修复非常简单。谢谢!
【解决方案2】:

当您使用区域并且您在区域和根中具有相同的控制器名称时,通常会出现此错误消息。例如你有两个:

  • ~/Controllers/HomeController.cs
  • ~/Areas/Admin/Controllers/HomeController.cs

为了解决此问题(如错误消息所示),您可以在声明路由时使用命名空间。所以在Global.asax的主路由定义中:

routes.MapRoute(
    "Default",
    "{controller}/{action}/{id}",
    new { controller = "Home", action = "Index", id = UrlParameter.Optional },
    new[] { "AppName.Controllers" }
);

在你的~/Areas/Admin/AdminAreaRegistration.cs:

context.MapRoute(
    "Admin_default",
    "Admin/{controller}/{action}/{id}",
    new { action = "Index", id = UrlParameter.Optional },
    new[] { "AppName.Areas.Admin.Controllers" }
);

如果您不使用区域,您的两个应用程序似乎都托管在同一个 ASP.NET 应用程序中,并且会发生冲突,因为您在不同的命名空间中定义了相同的控制器。如果您想避免此类冲突,则必须配置 IIS 以将这两个托管为单独的 ASP.NET 应用程序。如果您无权访问服务器,请咨询您的托管服务提供商。

【讨论】:

  • 我根本没有使用区域。这是两个完全不相关的应用程序,位于 FTP 根文件夹内的单独文件夹中。也许我的应用程序正在尽其所能地寻找 MVC 控制器,而这个范围恰好扩展到另一个 Home 控制器。我怎么能告诉它除了它自己的 Controller 文件夹之外什么都不看,而忽略其余的?
  • @SergioTapia,它们似乎与您的应用程序非常相关。您的托管服务提供商将它们放在同一个 ASP.NET 应用程序中。您将不得不要求他将它们作为单独的实例在 IIS 中拆分,否则您将遇到很多问题。
  • 谢谢。在 ASP MVC 4.0 中,您需要传递命名参数,如命名空间:new[] {"AppName.Areas.Admin.Controllers" }
  • +1 - 效果很好。我没有意识到区域中有一个单独的区域用于路线注册。在我看来,Darin 给出了一个高质量的答案:)
  • 如果您正在使用区域并想要命名控制器,您需要命名两个区域内的路由外部。只有命名区域路由仍然给我这个问题。
【解决方案3】:

在 MVC4 和 MVC5 中有点不同,使用如下

/App_Start/RouteConfig.cs

namespace MyNamespace
{
    public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
                namespaces:  new[] {"MyNamespace.Controllers"}
            );
        }
    }
}

在地区

context.MapRoute(
                "Admin_default",
                "Admin/{controller}/{action}/{id}",
                new { action = "Index", id = UrlParameter.Optional },
                new[] { "MyNamespace.Areas.Admin.Controllers" }
            );

【讨论】:

    【解决方案4】:

    看这个...http://www.asp.net/mvc/videos/mvc-2/how-do-i/aspnet-mvc-2-areas

    然后这张图(希望你喜欢我的画)

    【讨论】:

    • 解决了这个问题..! :)
    • @ppumkin 告诉盲人程序员。屏幕阅读器可以阅读文本
    • 嗨,卡洛斯。是的,我了解情况。没有能见度障碍的人已经很难解释它了。我什至不确定是否有任何类型的辅助软件能够很好地向任何人描述图片中发生的事情。它确实引起了人们的注意,答案可能应该有文字,至少试图描述正在发生的事情。
    【解决方案5】:

    在您的项目bin/ 文件夹中

    确保您只有您的 PROJECT_PACKAGENAME.DLL

    并删除 ANOTHER_PROJECT_PACKAGENAME.DLL

    这可能会错误地出现在此处,或者您只是重命名了您的项目

    【讨论】:

    • 正是我的问题。谢谢。
    • 为我工作!谢谢!
    • 我更改了程序集名称,并且在 bin 中有一些旧的 dll。谢谢
    • 谢谢!我不敢相信我错过了这么简单的事情。
    【解决方案6】:

    其他人说的是正确的,但对于那些仍然面临同样问题的人:
    就我而言,这是因为我复制了另一个项目并将其重命名为其他BUT以前的输出文件在bin 文件夹中仍然存在......不幸的是,在重命名项目后点击Build -> Clean Solution 并且它的Namespaces 不会删除它们...所以手动删除它们解决了我的问题!

    【讨论】:

    • 你的建议救了我
    • 我也是,谢谢,clean dosnt 实际上意味着干净,grrrrr
    • 谢谢@DrTJ 这太令人沮丧了!您期望该当干净的过程能够正常工作,而期望是失败的根源。这让我把头发拉得更远了!
    【解决方案7】:

    如果有另一个 dll 文件可能与 homeController 类冲突,请检查 bin 文件夹。

    【讨论】:

    • 复制项目并重命名时这点我... 名为 dll 的旧项目仍在 bin 中,清理没有删除它... 我不得不手动删除它!
    • 这对我来说是个问题。一位同事错误地将一个前端项目的引用添加到另一个创建此问题的项目。他删除了引用,因此 Visual Studio 也删除了他磁盘上的 dll 文件。我从 Git 中提取了更新,引用消失了,但 dll 文件仍然存在,即使在清理之后。仅仅因为我的 VS 不再看到参考。但是在运行 IIS 时看到了这些文件并使用了它们。从我的磁盘中删除它们很有帮助。
    【解决方案8】:

    另一种解决方案是向 ControllerBuilder 注册一个默认命名空间。由于我们的主应用程序中有很多路由,而我们的区域中只有一个通用路由(我们已经指定了命名空间),我们发现这是最简单的解决方案:

    ControllerBuilder.Current
         .DefaultNamespaces.Add("YourApp.Controllers");
    

    【讨论】:

    • 对我来说就是这种情况。如果您确实有多个具有相同名称的控制器,则在您将命名空间添加到路由定义后可能需要这样做。例如,对于路径未明确选择控制器和区域的主页。
    • 在我从事的项目中,我们有一个主要的交钥匙后台办公室,其中包括用于定制客户工作的区域。每个都有一个“设置”控制器。这个答案是必须为每个区域的设置控制器定义路由的绝佳选择。
    【解决方案9】:

    即使你不使用区域,你仍然可以在你的 RouteMap 中指定使用哪个命名空间

    routes.MapRoute(
        "Default",
        "{controller}/{action}",
        new { controller = "Home", action = "Index" },
        new[] { "NameSpace.OfYour.Controllers" }
    );
    

    但听起来实际问题是您的两个应用程序在 IIS 中的设置方式

    【讨论】:

      【解决方案10】:

      我刚遇到这个问题,但只有当我发布到我的网站时,在我的本地调试中它运行良好。我发现我必须使用我的虚拟主机上的 FTP 并进入我的发布目录并删除 BIN 文件夹中的文件,当我发布时在本地删除它们没有任何作用。

      【讨论】:

      • 这是对我的修复。我的发布配置文件没有删除本地不存在的文件,因此我的应用除了新的 dll 之外还拾取了旧的 dll 并发现了重复的类型。
      • 我更改了我的项目名称,并重新编译了所有文件,但随后出现此错误。删除 bin 文件夹也对我有用。
      【解决方案11】:

      如果你想自动解决它..你可以使用应用程序 assambly 只需添加以下代码:

       routes.MapRoute(
                  name: "Default",
                  url: "{controller}/{action}/{id}",
                  defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
                  namespaces: new[] { string.Format("{0}.Controllers", BuildManager.GetGlobalAsaxType().BaseType.Assembly.GetName().Name) }
              );
      

      【讨论】:

      • 如果您在多个项目中拥有相同的控制器,这是一个很好的解决方案
      【解决方案12】:

      Areas 可能还有另一种情况,即使您已经按照 Areas 中路由的所有步骤(例如在全局路由表中提供 Namespaces)进行操作,即:

      您可能没有将全局控制器包装在“命名空间”中 您在路由中提供。

      例如:

      这样做:

      public class HomeController : Controller
      {
      

      代替:

      namespace GivenNamespace.Controllers
      {
         public class HomeController : Controller
         {
      

      【讨论】:

      • 是的 仅仅在 MapRoute 中提供命名空间是不够的。这里提供的命名空间需要和控制器类所在的命名空间相匹配。现在可以了!
      【解决方案13】:

      如果您通过覆盖 DefaultAssembliesResolver 的 GetAssemblies 添加自己的包含 ApiController 的程序集,并且它已经在 base.GetAssemblies() 的数组中,也可能会收到 500 错误

      例子:

      public class MyAssembliesResolver : DefaultAssembliesResolver
      {
          public override ICollection<Assembly> GetAssemblies()
          {
              var baseAssemblies = base.GetAssemblies();
      
              var assemblies = new List<Assembly>(baseAssemblies);
      
              assemblies.Add(Assembly.GetAssembly(typeof(MyAssembliesResolver)));
      
              return new List<Assembly>(assemblies);
          }
      }
      

      如果上述代码与您的 Controller 位于同一程序集中,则该程序集将出现在列表中两次,并且将生成 500 错误,因为 Web API 不知道要使用哪一个。

      【讨论】:

        【解决方案14】:

        遇到同样的麻烦,没有任何帮助。问题是我实际上没有任何重复项,在将项目命名空间从MyCuteProject 切换到MyCuteProject.Web 后出现此错误。

        最后我意识到错误的来源是global.asax 文件——XML 标记,而不是.cs-codebehind。检查其中的命名空间——这对我有帮助。

        【讨论】:

          【解决方案15】:

          在 Route.config 中

          命名空间:new[] { "Appname.Controllers" }

          【讨论】:

            【解决方案16】:

            我刚刚从服务器中删除了文件夹“Bin”并将我的 bin 复制到服务器,我的问题就解决了。

            【讨论】:

              【解决方案17】:

              有时在单个应用程序中也会出现此问题在这种情况下,当您发布应用程序时选中这些复选框

              【讨论】:

                【解决方案18】:

                我们发现,当我们的构建中出现冲突并显示为警告时,我们会收到此错误。

                直到我们将 Visual Studio -> 工具 -> 选项 -> 项目和解决方案 -> 构建和运行 -> MSBuild 项目构建输出详细程度增加到详细信息后,我们才获得详细信息。

                我们的项目是一个 .net v4 Web 应用程序,System.Net.Http (v2.0.0.0) 和 System.Net.Http (v4.0.0.0) 之间存在冲突。我们的项目从一个包中引用了该文件的 v2 版本(使用 nuget 包含在内)。当我们删除引用并添加对 v4 版本的引用时,构建工作(没有警告)并且错误得到修复。

                【讨论】:

                  【解决方案19】:

                  此错误的其他变体是当您使用 resharper 并使用一些“自动”重构选项(包括更改命名空间名称)时。这就是发生在我身上的事情。解决此类场景删除文件夹bin

                  【讨论】:

                  • 当我复制到一个项目的内容而不是另一个项目的内容时,这发生在我身上。我不得不从 bin 文件夹中删除特定文件
                  【解决方案20】:

                  右键单击项目并选择清理项目。或者完全清空 bin 目录,然后重新构建。这应该清除以前构建中的任何剩余程序集

                  【讨论】:

                    【解决方案21】:

                    如果它可以帮助其他人,我也面临这个错误。 问题是由我网站中的不正确引用引起的。 由于未知原因,我的网站在同一解决方案中引用了另一个网站。 一旦我删除了那个不好的参考,事情就开始正常工作了。

                    【讨论】:

                      【解决方案22】:

                      如果您在 Episerver 或其他基于 MVC 的 CMS 中工作,您可能会发现该特定控制器名称已被声明。

                      这发生在我尝试创建名为 FileUpload 的控制器时。

                      【讨论】:

                        【解决方案23】:

                        我遇到了类似的问题。主要原因是我在两个不同的区域有相同的控制器。一旦我删除其中一个,它就可以正常工作。

                        我有它会对你有所帮助。

                        【讨论】:

                          【解决方案24】:

                          我有两个具有相同控制器名称的解决方案中的项目。我在第一个项目中删除了第二个项目参考,问题已解决

                          【讨论】:

                            【解决方案25】:

                            我发现当您在非 App_Code 目录中创建控制器时,传统的 ASP.NET 网站可能会发生此错误(有时 Visual Studio 会阻止此错误)。

                            它将文件类型设置为“编译”,而添加到“App_Code”的任何代码都设置为“内容”。如果您将文件复制或移动到 App_Code 中,则它仍设置为“编译”。

                            我怀疑它与网站项目操作有关,因为网站项目没有任何构建操作。清除 bin 文件夹并更改为“内容”似乎可以解决它。

                            【讨论】:

                              猜你喜欢
                              • 1970-01-01
                              • 1970-01-01
                              • 1970-01-01
                              • 1970-01-01
                              • 1970-01-01
                              • 1970-01-01
                              • 1970-01-01
                              相关资源
                              最近更新 更多