ASP.Net MVC 4. 在单独的程序集中路由控制器返回错误 404

Posted

技术标签:

【中文标题】ASP.Net MVC 4. 在单独的程序集中路由控制器返回错误 404【英文标题】:ASP.Net MVC 4. Routing a controller in a separate assembly returns error 404 【发布时间】:2013-07-02 13:19:50 【问题描述】:

我正在尝试执行看似简单的任务 - 从我的项目中的单独程序集中调用控制器。

但是,当我从该控制器请求信息时,我收到了错误 404。过去 5-6 小时我一直在与它作斗争,我怀疑我可能遗漏了一些小而明显的东西,这就是为什么我希望一个建议。

我在 stakoverflow 上发现了有关路由和错误 404 的类似问题,但是当我实施另一个原型项目时,我没有收到此类错误并使用类似的代码结构,我相信他们描述的问题与我的不同。

对于一般情况 - 我想要实现的总体目标是在独立项目中实现一个区域,就像它所描述的 here。 我做了所有事情,就像链接中解释的那样,一个小原型(它工作得很好),现在正试图申请真正的项目。

这就是我包含装配和管理路线的方式:

    有一个主项目,其中一个区域代表隐藏的子项目“CommunicationBus”

    “CommunicationBus”项目包含一个“CommunicationBusAreaRegistration”类。注册路由正常工作,我可以使用调试器到达这里,当我使用 routedebugger 时我也可以看到这条路由(见下面的截图)。我还为这个类玩过命名空间,最后尝试添加.Areas.CommunicationBus,但我注意到它没有任何区别。

    namespace MBVD.MainProject.UI
    
        public class CommunicationBusAreaRegistration : AreaRegistration
        
            public override string AreaName
            
                get
                
                    return "CommunicationBus";
                
            
    
            public override void RegisterArea(AreaRegistrationContext context)
            
                context.MapRoute(
                    "CommunicationBus_default",
                    "CommunicationBus/controller/action/id",
                    new  action = "Index", id = UrlParameter.Optional ,
                    new string[]  "CommunicationBus.Controllers" 
                );
            
        
    
    

    在主项目的 Global.asax 中,我通过以下方式注册路由:

    public static void RegisterRoutes(RouteCollection routes)
    
        routes.IgnoreRoute("resource.axd/*pathInfo");
    
        routes.MapRoute(
            "Default", // Route name
            "controller/action/id", 
            new  controller = "Home", action = "Index", id = UrlParameter.Optional ,
            new[]  "MBVD.MainProject.UI.Controllers"  
        );
    
    

    如果我在此处引用“CommunicationBus.Controllers”,我将无法再打开主应用程序的页面。但是,我相信我只需要在此处注册主应用程序控制器的路径

    CommunicationBus 项目的输出路径设置为主项目的 bin 文件夹。每次我构建 CommunicationBus 时,我都会在主项目中获得一个新的 .dll。

    我在 CommunicationBus 项目中添加了一个简单的控制器:

    namespace CommunicationBus.Controllers
    
        public class TestController : Controller
        
            [HttpGet]
            public string Index()
            
                return "It works!";
            
        
    
    

    我添加了一个指向主项目的链接

     @html.ActionLink("test","Index","Test", new Area="CommunicationBus", null)
    

    这是:

    localhost:63254/CommunicationBus/Test

    我使用了 routedebugger,它没有显示任何可疑的东西:

我对这两个项目都使用 ASP.NET MVC 4。

如果我能提供任何想法来找出我收到此错误的原因,我将不胜感激。

【问题讨论】:

【参考方案1】:

我相信您收到此错误是因为您的路由顺序。由于/CommunicationBus/Test 匹配/controller/action/id/CommunicationBus/controller/action/id,第一个注册路由(/controller/action/id)优先于所需路由,并且MVC 在默认命名空间(MBVD.MainProject.UI.Controllers)中找不到名为@987654327 的控制器@。

尝试在默认路线之前注册您的区域路线。或者,您可以一起跳过该业务并使用属性路由 (http://blogs.msdn.com/b/webdev/archive/2013/10/17/attribute-routing-in-asp-net-mvc-5.aspx)。如果您使用属性路由,则需要确保在调用 routes.MapMvcAttributeRoutes(); 之前从所有命名空间加载控制器(如果您只是作为参考,这没问题,只有在动态加载参考)。

【讨论】:

以上是关于ASP.Net MVC 4. 在单独的程序集中路由控制器返回错误 404的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET MVC 中单独程序集中的视图

ASP.NET MVC 和组件架构

Orchard源码分析:ASP.NET MVC相关

为啥当控制器位于 asp.net 核心应用程序的单独程序集中时,TestServer 无法找到控制器?

将 ASP.Net MVC 与 WebForms 相结合

在 ASP.NET MVC Preview 4 中使用路由引擎进行表单提交