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


318

我目前有两个不相关的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。

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


非常不清楚的问题。您正在使用区域吗?问题是否在本地发生?
达林·迪米特洛夫

1
@Darin:编辑的参阅。
只有玻利维亚这里

Answers:


473

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

  • ~/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。我怎样才能告诉它不要在任何地方看到,而是它自己的Controller文件夹,而忽略其余部分?
这里只有玻利维亚人

2
@SergioTapia,看来它们与您的应用程序非常相关。您的托管服务提供商将它们放在同一ASP.NET应用程序中。您将不得不问他在IIS中将它们拆分为单独的实例,否则您将遇到很多问题。
Darin Dimitrov

13
谢谢。在ASP MVC 4.0中,您需要传递命名参数,例如名称空间:new [] {“ AppName.Areas.Admin.Controllers”}
om471987 2012年

1
+1-运作良好。我没有意识到在该区域中没有单独的区域用于路线注册。我所到之处似乎都可以从达林那里得到一个高质量的答案:)
特拉维斯J

1
如果您正在使用区域并希望对控制器进行命名空间,则需要对区域内部外部的路由进行命名空间。只有命名区域路由仍然给我这个问题。
加文·沃德

528

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

解决方法是转到您的bin文件夹并删除旧的dll。(我尝试过“重建项目”,但是并没有删除它们,因此请务必检查bin以确保它们已消失)


1
此错误的其他变体是当您使用resharper并使用一些“自动”重构选项(包括名称空间名称更改)时。这就是我发生的事情。
塞巴斯蒂安506563 '16

5
如果要从Azure应用服务获得此信息,请转到https:// <your_app_name_here> .scm.azurewebsites.net / DebugConsole登录并删除文件。
Tom Blodget

5
谢谢,这是我的问题。我通过将现有项目复制/粘贴到新文件夹中来创建“新”项目;旧版本的dll随之而来,删除bin文件夹将其擦干净
brando

将项目文件移动到另一个驱动器时,出现了这个问题。清除bin文件夹即可解决。最奇怪的东西。
罗伯托·博尼尼

好吧,这是一个非常烦人的错误,而且修复非常简单。谢谢!
Troy Grosfield '17

63

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

39

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

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

在此处输入图片说明


解决了问题..!:)
阿鲁纳2014年

1
@ppumkin告诉盲人程序员。文本可以由屏幕阅读器读取
卡洛斯·穆尼奥斯

嗨,卡洛斯。是的,我了解情况。很难解释没有视力障碍的人。我什至不知道任何一种辅助软件都能够很好地描述图片中发生的任何事情。它确实引起了人们的注意,答案应该至少包含试图描述正在发生的事情的文字。
Piotr Kula

32

其他人说的是正确的,但对于仍然面临相同问题的人:
在我的情况下,这是因为我复制了另一个项目n将该项目重命名为其他名称,但是文件bin夹中的先前输出文件仍然存在...而且很遗憾,Build -> Clean Solution重命名项目,Namespaces 并且不会删除它们...因此手动删除它们解决了我的问题!


2
您的建议救了我
Abhimanyu 2015年

1
我也是,谢谢,清洁剂量实际上意味着清洁,grrrr
katibaer 2015年

1
谢谢@DrTJ这太令人沮丧了!您希望当场清洁过程能够正常工作,而期望是失败的根源。这节省了我进一步拉出头发的机会!
迈克”

28

在您的项目bin/文件夹中

确保您只有PROJECT_PACKAGENAME.DLL

并删除ANOTHER_PROJECT_PACKAGENAME.DLL

可能会误显示在这里,或者您只是重命名您的项目


2
完全是我的问题。谢谢。
Detilium

为我工作!!!
eyal

我更改了程序集名称,并在垃圾箱中放了一些旧的dll。谢谢
apc

谢谢!我不敢相信我错过了这么简单的事情。
Vash

25

检查bin文件夹中是否存在另一个可能与homeController类冲突的dll文件。


7
这在复制项目并重命名时有点困扰我……名为dll的旧项目仍在bin中,清理并没有将其删除...我必须手动将其删除!
Paul Zahra 2014年

2
这是我的问题。一位同事错误地将一个前端项目的引用添加到另一个前端项目中,从而造成了此问题。他删除了引用,因此Visual Studio也删除了磁盘上的dll文件。我从Git提取了更新,引用消失了,但即使经过清理,dll文件仍然保留。仅仅是因为我的VS不再看到参考。但是在运行IIS时看到了文件并使用了它们。从我的磁盘中删除它们有帮助。
Yeronimo '18

14

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

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

对我来说就是这种情况。如果确实有多个具有相同名称的控制器,则在将名称空间添加到路由定义之后,可能需要这样做。例如,对于您的主页,其中路径未明确选择控制器和区域。
杰森·贝克

在我从事的项目中,我们有一个主要的总包后台,其中包含用于自定义客户端工作的区域。每个人都有一个“设置”控制器。该答案是必须为每个区域的设置控制器定义路径的绝佳选择。
Derreck Dean

7

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

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

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


7

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


这是我的解决办法。我的发布配置文件没有删除本地不存在的文件,因此我的应用程序除了获取新的dll外还选择了旧的dll,并发现了重复的类型。
表格

1
我更改了项目名称,并保留了所有文件,但随后出现此错误。删除bin文件夹也对我有用。
Mauro Valvano

6

即使您遵循了在区域中进行路由的所有步骤(例如在全局路由表中提供命名空间),也可能会出现区域问题

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

例如:

完成此操作:

public class HomeController : Controller
{

代替:

namespace GivenNamespace.Controllers
{
   public class HomeController : Controller
   {

是的仅在MapRoute中提供名称空间是不够的。此处提供的名称空间需要与控制器类所在的名称空间匹配。现在可以使用!
DanKodi

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不知道使用哪个程序集。


6

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

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

1
如果您在多个项目中具有相同的控制器,则是一个很好的解决方案
Ravi Anand

4

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

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


2

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


2

在Route.config中

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


1

我们发现当构建中出现冲突作为警告时,我们得到了此错误。

在将Visual Studio->工具->选项->项目和解决方案->生成并运行-> MSBuild项目将输出详细程度提高到“详细”之前,我们没有得到细节。

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


1

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


当我将一个项目的内容复制到另一个项目的内容时,这发生在我身上。我不得不从bin文件夹中删除特定文件
Adriaan Davel

1

右键单击项目,然后选择清理项目。否则,请完全清空bin目录,然后重新构建。这应该清除以前版本中剩下的所有程序集



1

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


0

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

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


0

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

我有它将对您有所帮助。

项目解决方案



0

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.