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

Onl*_*ere 302 c# controller asp.net-mvc-3

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

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

找到了多个匹配名为"Home"的控制器的类型.如果为此请求提供服务的路由('{controller}/{action}/{id}')未指定名称空间来搜索与请求匹配的控制器,则会发生这种情况.

如果是这种情况,请通过调用带有'namespaces'参数的'MapRoute'方法的重载来注册此路由.

我的主机工作方式是他给我FTP访问权限,在该文件夹中我有两个其他文件夹,一个用于我的每个应用程序.

ftpFolderA2/foo.com

ftpFolderA2/bar.com

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

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

bar.com是否在ftpFolderA2内部的控制器中搜索,这就是为什么它会找到另一个HomeController?我怎么能告诉它只应该看看Controller文件夹呢?

事实:

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

有人可以证实这是问题吗?

Kir*_*oll 515

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

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

  • 如果从Azure应用服务获取此信息,请转至https:// <your_app_name_here> .scm.azurewebsites.net/DebugConsole以登录和删除文件. (5认同)
  • 这对我来说是个问题.我通过将现有项目复制/粘贴到新文件夹中创建了一个"新"项目; 旧的构建dll附带,删除bin文件夹擦干净 (3认同)

Dar*_*rov 463

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

  • ~/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" }
);
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • 谢谢.在ASP MVC 4.0中,您需要传递命名参数,如命名空间:new [] {"AppName.Areas.Admin.Controllers"} (13认同)
  • @SergioTapia,似乎它们与你的应用程序非常相关.您的托管提供商将它们放在同一个ASP.NET应用程序中.您将不得不要求他将它们作为单独的实例在IIS中拆分,否则您将遇到很多问题. (2认同)
  • 如果您正在使用区域并希望为控制器命名空间,则需要为区域内的路由和区域外的路由 **both** 命名空间。只有命名区域路线仍然给我这个问题。 (2认同)

Dev*_*per 61

在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"}
            );
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在地区

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


Tom*_*Tom 39

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

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

在此输入图像描述

  • 屏幕截图+1."图片胜过千言万语":) (13认同)

Dr *_* TJ 30

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

  • 你的建议救了我 (2认同)

Ami*_*tha 23

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

  • 复制项目并将其重命名时,这就是我...这个名为dll的旧项目仍然在bin中,清理没有删除它...我不得不手动删除它! (7认同)
  • 这对我来说是个问题。一位同事错误地将一个前端项目的引用添加到另一个导致此问题的引用。他删除了引用,因此 Visual Studio 也删除了他磁盘上的 dll 文件。我从 Git 中提取了更新,引用消失了,但 dll 文件仍然存在,即使经过清理。仅仅是因为我的 VS 不再看到参考。但是在运行 IIS 时看到了这些文件并使用了它们。从我的磁盘中删除它们有帮助。 (2认同)

Sru*_*Suk 22

在您的项目bin/文件夹中

确保您只有PROJECT_PACKAGENAME.DLL

并删除ANOTHER_PROJECT_PACKAGENAME.DLL

这可能是错误地出现在这里,或者你只是重命名你的项目

  • 正是我的问题。谢谢你。 (2认同)

Ben*_*ter 14

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

ControllerBuilder.Current
     .DefaultNamespaces.Add("YourApp.Controllers");
Run Code Online (Sandbox Code Playgroud)


Sta*_*anK 7

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

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

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


Mec*_*h0z 7

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


All*_*der 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果上面的代码与Controller在同一个程序集中,那个程序集将在列表中两次,并且会生成500错误,因为Web API不知道要使用哪个.


T G*_*pta 6

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

您可能没有将全局控制器包装在路由中提供的"命名空间"中.

例如:

做完这个:

public class HomeController : Controller
{
Run Code Online (Sandbox Code Playgroud)

代替:

namespace GivenNamespace.Controllers
{
   public class HomeController : Controller
   {
Run Code Online (Sandbox Code Playgroud)


小智 5

如果你想自动解决它..你可以使用应用程序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) }
        );
Run Code Online (Sandbox Code Playgroud)