ChatGPT解决这个技术问题 Extra ChatGPT

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

我目前有两个在线托管的不相关的 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 个 HomeController。

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

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

K
Kirk Woll

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

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


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

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

~/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 - 效果很好。我没有意识到区域中有一个单独的区域用于路线注册。在我所见的任何地方,似乎达林都有一个高质量的答案:)
如果您正在使用区域并想要命名控制器,则需要命名区域内部和外部的路由。只有命名区域路由仍然给我这个问题。
D
Developer

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

T
Tom

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

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

https://i.stack.imgur.com/YYh9V.png


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

在您的项目 bin/ 文件夹中

确保您只有您的 PROJECT_PACKAGENAME.DLL

并删除 ANOTHER_PROJECT_PACKAGENAME.DLL

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


正是我的问题。谢谢你。
为我工作!谢谢!
我更改了程序集名称,并在垃圾箱中放置了一些旧的 dll。谢谢
谢谢!我不敢相信我错过了这么简单的事情。
D
Dr TJ

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


你的建议救了我
我也是,谢谢,干净并不意味着干净,grrrr
谢谢@DrTJ 这太令人沮丧了!您期望该当干净的过程能够正常工作,而期望是失败的根源。这让我把头发拉得更远了!
M
Marko

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


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

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

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

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

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

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

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


M
Mech0z

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


这对我来说是解决办法。我的发布配置文件没有删除本地不存在的文件,因此我的应用程序除了新的 dll 之外还拾取了旧的 dll 并发现了重复的类型。
我更改了我的项目名称并重新编译了所有文件,但随后出现了此错误。删除 bin 文件夹也对我有用。
X
Xtremexploit

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

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

如果您在多个项目中拥有相同的控制器,那么很好的解决方案
T
T Gupta

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

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

例如:

这样做:

public class HomeController : Controller
{

代替:

namespace GivenNamespace.Controllers
{
   public class HomeController : Controller
   {

是的 仅仅在 MapRoute 中提供一个命名空间是不够的。这里提供的命名空间需要和控制器类所在的命名空间相匹配。现在可以了!
A
Allan Elder

如果您通过覆盖 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);
    }
}

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


A
Awais

在 Route.config 中

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


A
Arman Hayots

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

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


j
javad hemati

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


U
Umang Patwa

https://i.stack.imgur.com/SJt3n.png


A
AnthonyJ

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

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

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


S
Sebastian 506563

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


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

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


H
Hugo

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


佚名

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

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


S
Satish Kumar sonker

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

我有它会对你有所帮助。

https://i.stack.imgur.com/bnxMp.jpg


K
Kashif Faraz

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


C
Curtis White

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

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

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