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

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


当前回答

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

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

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

其他回答

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

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

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

如果你通过覆盖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不知道使用哪个程序集。

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

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

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