我目前有两个不相关的MVC3项目托管在线。

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

发现了与名为“Home”的控制器匹配的多种类型。这 如果服务此请求的路由会发生什么 ('{controller}/{action}/{id}')不指定要搜索的名称空间 与请求匹配的控制器。 如果是这样的话, 通过调用'MapRoute'方法的重载来注册这个路由 它接受一个“namespaces”参数。

我的主机的工作方式是,他给我FTP访问权限,在这个文件夹中,我有另外两个文件夹,一个用于我的应用程序。

ftpFolderA2 - foo。com ftpFolderA2 / bar。com

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

当我上传并尝试运行bar.com时,上面的问题触发并阻止我使用我的网站。同时,foo.com还在运作。

是bar.com搜索从ftpFolderA2内部的控制器,这就是为什么它正在寻找另一个HomeController?我怎么能告诉它只看在控制器文件夹,因为它应该?

事实:

不使用区域。这是两个完全不相关的项目。我将每个已发布的项目放入各自的文件夹中。没有什么幻想。 每个项目只有1个HomeController。

有人能确认是这个问题吗?


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

~ /控制器/ HomeController.cs ~ / / Admin /控制器/ HomeController.cs领域

为了解决这个问题(正如错误消息提示的那样),您可以在声明路由时使用名称空间。所以在global。asax的主路由定义中:

routes.MapRoute(
    "Default",
    "{controller}/{action}/{id}",
    new { controller = "Home", action = "Index", id = UrlParameter.Optional },
    new[] { "AppName.Controllers" }
);

在你的~/Areas/Admin/ adminareregistrations .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应用程序,如果您想避免此类冲突。如果您无法访问服务器,请向主机托管提供商咨询。


即使不使用区域,也可以在RouteMap中指定要使用的名称空间

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

但听起来真正的问题是你的两个应用程序在IIS中的设置方式


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


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

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

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

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


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

解决方案是转到bin文件夹并删除旧的dll。(我尝试了“重建项目”,但这并没有删除他们,所以一定要检查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不知道使用哪个程序集。


可能还有另一种情况,即使你已经遵循了在区域中路由的所有步骤(比如在全局路由表中给出命名空间),也就是:

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

Eg:

这样做:

public class HomeController : Controller
{

而不是:

namespace GivenNamespace.Controllers
{
   public class HomeController : Controller
   {

我们发现,当构建中出现冲突时,我们得到了这个错误,该冲突显示为警告。

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

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


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


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

别人说的是对的,但对于那些仍然面临同样问题的人来说: 在我的情况下,它发生了,因为我复制了另一个项目n重命名为其他东西,但以前的输出文件在bin文件夹仍然存在…不幸的是,在重命名项目和它的命名空间后,点击Build -> Clean Solution不会删除它们…所以手动删除它们解决了我的问题!


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

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

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


我只是删除文件夹'Bin'从服务器和复制我的Bin到服务器,我的问题解决了。


同样的麻烦,什么都没用。问题是我实际上没有任何副本,这个错误出现后切换项目名称空间从MyCuteProject到MyCuteProject. web。

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


在Route.config

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


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


有时在单个应用程序中也会出现此问题。在这种情况下,在发布应用程序时选择这些复选框


如果它能帮助别人,我也面对过这个错误。 这个问题是由我网站上的错误引用引起的。 由于未知的原因,我的网站引用了另一个网站,在相同的解决方案。 一旦我去掉了那个不好的参照,它就开始正常工作了。


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

当我试图创建一个名为FileUpload的控制器时,我就遇到了这种情况。


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

这对你有帮助。


在你的项目bin/文件夹中

确保只有PROJECT_PACKAGENAME.DLL

并删除另一个other_project_packagename . dll

它可能出现在这里,或者您只是重命名了项目


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


我发现这个错误可以发生在传统的ASP。当你在非App_Code目录下创建控制器时(有时Visual Studio会阻止这种情况)。

它将文件类型设置为“Compile”,而添加到“App_Code”中的任何代码都设置为“Content”。如果你复制或移动文件到App_Code,那么它仍然被设置为“Compile”。

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