繁体   English   中英

发现多种类型与名为“Home”的控制器相匹配

[英]Multiple types were found that match the controller named '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. 不使用区域。 这是两个完全不相关的项目。 我将每个已发布的项目放入各自的文件夹中。 没有什么花哨。
  2. 每个项目只有 1 个 HomeController。

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

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

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

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

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

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

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

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

在此处输入图片说明

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

在您的项目bin/文件夹中

确保您只有PROJECT_PACKAGENAME.DLL

并删除ANOTHER_PROJECT_PACKAGENAME.DLL

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

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

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

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

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

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

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

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

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

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

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

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

例如:

这样做:

public class HomeController : Controller
{

代替:

namespace GivenNamespace.Controllers
{
   public class HomeController : Controller
   {

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

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

在 Route.config 中

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

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

有时在单个应用程序中也会出现此问题 在这种情况下,在发布应用程序时选中这些复选框在此处输入图片说明

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

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

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

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

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

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

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

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

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

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

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

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

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

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

我有它对你有帮助。

项目解决方案

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM