Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 找到多个与名为';主页';_C#_Asp.net Mvc 3_Controller - Fatal编程技术网

C# 找到多个与名为';主页';

C# 找到多个与名为';主页';,c#,asp.net-mvc-3,controller,C#,Asp.net Mvc 3,Controller,我目前有两个不相关的MVC3项目在线托管 一个工作正常,另一个不工作,这给了我一个错误: 找到多个与名为“Home”的控制器匹配的类型。这 如果为该请求提供服务的路由 ({controller}/{action}/{id}')未指定要搜索的命名空间 用于与请求匹配的控制器 如果是这样的话,, 通过调用“MapRoute”方法的重载来注册此路由 接受“名称空间”参数的 我的主人的工作方式是,他给我FTP访问权限,在这个文件夹中,我还有两个其他文件夹,一个用于我的每个应用程序 ftpFolderA2

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

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

找到多个与名为“Home”的控制器匹配的类型。这 如果为该请求提供服务的路由 ({controller}/{action}/{id}')未指定要搜索的命名空间 用于与请求匹配的控制器

如果是这样的话,, 通过调用“MapRoute”方法的重载来注册此路由 接受“名称空间”参数的

我的主人的工作方式是,他给我FTP访问权限,在这个文件夹中,我还有两个其他文件夹,一个用于我的每个应用程序

ftpFolderA2/foo.com

ftpFolderA2/bar.com

foo.com工作正常,我将我的应用程序发布到本地文件系统,然后通过FTP传输内容,它就工作了

当我上传并尝试运行bar.com时,上面的问题会激发并阻止我使用我的网站尽管foo.com仍然有效

bar.com是否正在ftpFolderA2内的所有控制器中搜索,这就是为什么它会找到另一个
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/adminaregistration.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中的设置方式。我刚刚遇到了这个问题,但只有当我发布到我的网站上,在我的本地调试中,它才正常运行。我发现我必须从我的Web主机使用FTP,进入我的发布目录并删除BIN文件夹中的文件,在本地删除这些文件在我发布时没有任何作用。

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

    ControllerBuilder.Current
         .DefaultNamespaces.Add("YourApp.Controllers");
    
    看这个

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


    这里是另一个您可能遇到此错误的场景。如果重命名项目使程序集的文件名发生更改,则ASP.NET程序集可能有两个版本,这将重现此错误


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

    如果您通过覆盖DefaultAssembliesResolver的GetAssemblys来添加自己的包含ApicController的程序集,并且该程序集已经从base.GetAssemblys()中包含在数组中,也会出现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);
        }
    }
    
    公共类MyAssembliesResolver:DefaultAssembliesResolver
    {
    公共重写ICollection getAssemblys()
    {
    var baseAssemblies=base.GetAssemblies();
    变量程序集=新列表(基本程序集);
    Add(Assembly.GetAssembly(typeof(MyAssembliesResolver));
    返回新列表(组件);
    }
    }
    

    如果上述代码与控制器位于同一程序集中,则该程序集将在列表中出现两次,并将生成一个500错误,因为Web API不知道要使用哪一个。

    可能还有另一种情况,即区域即使您已在区域中执行了所有路由步骤(如在全局路由表中提供名称空间),即:

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

    例如:

    public class HomeController : Controller
    {
    
    namespace GivenNamespace.Controllers
    {
       public class HomeController : Controller
       {
    
    完成此操作:

    public class HomeController : Controller
    {
    
    namespace GivenNamespace.Controllers
    {
       public class HomeController : Controller
       {
    
    而不是:

    public class HomeController : Controller
    {
    
    namespace GivenNamespace.Controllers
    {
       public class HomeController : Controller
       {
    

    我们发现,当我们的构建中出现冲突并显示为警告时,我们出现了这个错误

    直到将VisualStudio->Tools->Options->project and Solutions->Build and Run->MSBuild project生成输出详细信息增加到Detailed,我们才获得详细信息


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

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

    在MVC4和MVC5中,有点不同,请使用以下命令

    /App\u启动/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" }
                );
    
    和区域内的

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

    其他人所说的是正确的,但对于那些仍然面临同样问题的人来说:
    就我而言,这是因为我复制了另一个项目