我目前有两个不相关的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。
有人能确认是这个问题吗?
在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" }
);
即使不使用区域,也可以在RouteMap中指定要使用的名称空间
routes.MapRoute(
"Default",
"{controller}/{action}",
new { controller = "Home", action = "Index" },
new[] { "NameSpace.OfYour.Controllers" }
);
但听起来真正的问题是你的两个应用程序在IIS中的设置方式
如果你通过覆盖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不知道使用哪个程序集。