找到了多个匹配名为“Home”的控制器的类型

时间:2011-10-20 21:09:19

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

我目前在线托管了两个不相关的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。
  3. 有人可以确认这是问题吗?

26 个答案:

答案 0 :(得分:510)

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

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

答案 1 :(得分:450)

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

  • ~/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应用程序托管。如果您无法访问服务器,请咨询您的托管服务提供商。

答案 2 :(得分:57)

在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" }
            );

答案 3 :(得分:39)

观看此内容...... http://www.asp.net/mvc/videos/mvc-2/how-do-i/aspnet-mvc-2-areas

然后这张照片(希望你喜欢我的图纸)

enter image description here

答案 4 :(得分:29)

其他人说的是正确的,但对于仍然面临同样问题的人: 在我的情况下,它发生了,因为我复制了另一个项目,将其重命名为其他 bin文件夹中的先前输出文件仍然存在...而且不幸的是,之后点击了Build -> Clean Solution重命名项目及其Namespaces 无法删除 ...所以删除他们手动解决了我的问题!

答案 5 :(得分:23)

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

答案 6 :(得分:21)

项目bin/文件夹

中的

确保您只有 PROJECT_PACKAGENAME.DLL

并删除 ANOTHER_PROJECT_PACKAGENAME.DLL

可能会错误地显示在此处,或者您只是重命名项目

答案 7 :(得分:14)

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

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

答案 8 :(得分:7)

即使您没有使用区域,您仍然可以在RouteMap中指定要使用的命名空间

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

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

答案 9 :(得分:7)

我刚刚遇到这个问题,但只有当我发布到我的网站时,在我的本地调试上运行正常。我发现我必须使用来自我的webhost的FTP并进入我的发布目录并删除BIN文件夹中的文件,在我发布时在本地删除它们什么也没做。

答案 10 :(得分:6)

区域 可能还有另一种情况,即使您已按照区域中的路由中的所有步骤(例如在全局路由表中提供命名空间),即:

  

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

<强>例如

完成此操作:

public class HomeController : Controller
{

代替:

namespace GivenNamespace.Controllers
{
   public class HomeController : Controller
   {

答案 11 :(得分:6)

如果通过覆盖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不知道要使用哪个。

答案 12 :(得分:5)

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

 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) }
        );

答案 13 :(得分:4)

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

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

答案 14 :(得分:2)

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

答案 15 :(得分:2)

在Route.config中

命名空间:new [] {&#34; Appname.Controllers&#34; }

答案 16 :(得分:1)

如果您的应用程序的 bin 文件夹中有另一个DLL,并且该DLL的控制器名为Home,但其命名空间与HomeController不同,则也会发生这种情况。

例如,如果您更改了项目名称,并且仍然从旧项目中编译了二进制文件,那么即使通过选择 Clean Solution 菜单命令来清理解决方案,旧二进制文件将保留。

如果任何旧的二进制文件具有相同的控制器名称(如果您只是更改了项目程序集名称和一些命名空间,它们将具有相同的控制器名称),则可能会出现此问题。

确保从bin文件夹中删除不需要的所有其他程序集。

这是一个视频演示:https://youtu.be/8Snz2ySTAU8

答案 17 :(得分:1)

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

答案 18 :(得分:1)

在单个应用程序中的某个时间此问题也会出现在这种情况下,在发布应用程序时选中这些复选框 enter image description here

答案 19 :(得分:1)

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

答案 20 :(得分:1)

此错误的其他变体是当您使用resharper并使用某些&#34; auto&#34;包含命名空间名称更改的重构选项。这就是发生在我身上的事。要解决此类场景删除文件夹bin

的问题

答案 21 :(得分:0)

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

在尝试创建名为FileUpload的控制器时发生了这种情况。

答案 22 :(得分:0)

我正面临类似的问题。主要原因是我在两个不同的区域有相同的控制器。一旦我删除其中一个工作正常。

我觉得它会对你有所帮助。

Project Solution

答案 23 :(得分:0)

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

答案 24 :(得分:0)

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

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

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

答案 25 :(得分:0)

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

在我们增加Visual Studio之前,我们没有得到详细信息 - &gt;工具 - &gt;选项 - &gt;项目和解决方案 - &gt;构建和运行 - &gt; MSBuild项目构建输出详细程度为Detailed。

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