发现多个types与名为“Home”的控制器匹配
我目前有两个不相关的MVC3项目在线托pipe。
一个正常工作,另一个不起作用,给我的错误:
发现多个与名为“Home”的控制器相匹配的types。 如果为该请求提供服务的路由(“{controller} / {action} / {id}”)没有指定命名空间来search与该请求匹配的控制器,则会发生这种情况。
如果是这种情况,请通过调用带有“namespaces”参数的“MapRoute”方法的重载来注册此路由。
我的托pipe人的工作方式是,他给我的FTP访问,并在该文件夹中,我有另外两个文件夹,每个我的应用程序。
ftpFolderA2 / foo.com
ftpFolderA2 / bar.com
foo.com工作正常,我发布我的应用程序到我的本地文件系统,然后FTP的内容,它的工作原理。
当我上传并尝试运行bar.com时,上面的问题触发,并阻止我使用我的网站。 虽然foo.com仍然有效 。
bar.com是否从ftpFolderA2里面的控制器里search,这就是为什么它find另一个HomeController
? 我怎么能告诉它只看在控制器文件夹,因为它应该?
事实:
- 不使用区域。 这是两个完全不相关的项目。 我将每个发布的项目放到每个文件夹中。 没有什么花哨。
- 每个项目只有一个HomeController。
有人可以证实这是问题吗?
当您使用区域并且在区域和根目录中具有相同的控制器名称时,通常会出现此错误消息。 比如你有两个:
-
~/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应用程序中,并且会发生冲突,因为您在不同的命名空间中定义了相同的控制器。 如果要避免这种冲突,则必须将IISconfiguration为将这两者作为单独的ASP.NET应用程序托pipe。 如果您无法访问服务器,请询问您的托pipe服务提供商。
这是另一种情况,你可能会遇到这个错误。 如果您重命名您的项目,以便程序集的文件名更改,您可能有两个版本的ASP.NET程序集,这将重现此错误。
解决办法是去你的bin
文件夹,并删除旧的DLL。 (我尝试过“重build项目”,但是并没有删除它们,所以请确保检查bin
以确保它们不在)
在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
然后这张照片(希望你喜欢我的图纸)
别人说的是正确的,但对于那些仍然面临同样问题的人来说:
在我的情况下,它发生了,因为我复制了另一个项目n重命名为其他项目, 但在bin
文件夹中的以前的输出文件仍然存在…不幸的是,重命名该项目及Namespaces
后,打Build -> Clean Solution
不会删除它们…所以手动删除它们解决了我的问题!
检查bin文件夹,如果有另一个dll文件可能与homeController类发生冲突。
另一个解决scheme是使用ControllerBuilder注册一个默认名称空间。 由于在我们的主应用程序中有很多路由,并且在我们的区域(我们已经指定了一个名称空间)中只有一条通用路由,所以我们发现这是最简单的解决scheme:
ControllerBuilder.Current .DefaultNamespaces.Add("YourApp.Controllers");
即使您不使用区域,您仍然可以在RouteMap中指定要使用的命名空间
routes.MapRoute( "Default", "{controller}/{action}", new { controller = "Home", action = "Index" }, new[] { "NameSpace.OfYour.Controllers" } );
但听起来像是你的两个应用程序在IIS中设置的实际问题
我只是有这个问题,但只有当我发布到我的网站,在我的本地debugging运行良好。 我发现我必须使用从我的虚拟主机FTP并进入我的发布目录和删除BIN文件夹中的文件,删除它们在本地没有做什么,当我发表。
可能还有另外一种情况,即使你在区域中按照路由的所有步骤(如给全局路由表中的命名空间),也就是:
您可能没有将您的全局控制器封装在您在路由中提供的“命名空间”中。
例如:
完成这个:
public class HomeController : Controller {
代替:
namespace GivenNamespace.Controllers { public class HomeController : Controller {
如果您通过重写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); } }
如果上面的代码与您的Controller在同一个程序集中,那么该程序集将在列表中两次,并且将生成一个500错误,因为Web API不知道要使用哪一个。
如果你想自动解决它..你可以使用应用程序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) } );
有同样的麻烦,没有任何帮助。 问题是我实际上没有任何重复,从MyCuteProject
切换到MyCuteProject.Web
项目命名空间后出现此错误。
最后我意识到错误的来源是一个global.asax
文件 – XML标记,而不是.cs
codebehind。 检查命名空间 – 这是帮助我。
我只是从服务器删除文件夹“斌”,并将我的垃圾箱复制到服务器,我的问题解决了。
此错误的其他变体是当您使用resharper,并使用一些“自动”重构选项,包括命名空间名称更改。 这是发生在我身上的事情。 解决这种情况下删除文件夹bin
在Route.config中
namespaces:new [] {“Appname.Controllers”}
右键单击项目并select清理项目。 或者彻底清空bin目录,然后重新编译。 这应该清除以前的版本中的任何遗留的程序集
在单个应用程序中有一段时间,这个问题也出现了
如果可以帮助其他人,我也面对这个错误。 这个问题是由于在我的网站上引用不正确。 由于不明的原因,我的网站是在同一个解决scheme中引用另一个网站。 而一旦我删除了这个不好的参考,事情开始正常工作。
在你的项目bin/
文件夹中
确保你只有你的PROJECT_PACKAGENAME.DLL
并删除ANOTHER_PROJECT_PACKAGENAME.DLL
这可能会出现在这里,或者你只是重命名你的项目
我们发现当我们的版本中出现冲突时,我们得到了这个错误。
我们没有得到详细信息,直到我们增加了Visual Studio – >工具 – >选项 – >项目和解决scheme – >生成并运行 – > MSBuild项目生成输出详细到详细。
我们的项目是.net v4 web应用程序,System.Net.Http(v2.0.0.0)和System.Net.Http(v4.0.0.0)之间有冲突。 我们的项目从一个包中引用了v2版本的文件(包括使用nuget)。 当我们删除了引用,并添加了对v4版本的引用,那么构build工作(没有警告),错误被修复。
如果您在Episerver或另一个基于MVC的CMS中工作,则可能会发现该特定的控制器名称已被声明。
尝试创build名为FileUpload
的控制器时,发生了这种情况。
我正面临类似的问题。 主要原因是我在两个不同的区域有相同的控制器。 一旦我删除其中的一个工作正常。
我对它有帮助。