为什么我的RouteHandler会破坏我的路由命名空间?

时间:2014-03-20 18:58:14

标签: asp.net asp.net-mvc asp.net-mvc-routing

我正在使用一种约定,其中我在网址如/api/product/{action}处有一个web api端点,并在相应的网址api/test/product/{action}处使用传统的MVC测试页面。 Api和Test有自己的命名空间,因此api控制器是MyApp.Controllers.Api.ProductController命名空间,而测试控制器是MyApp.Controllers.Api.Test.ProductController

这很好,除了我需要指定名称空间以便框架在发出请求时知道要使用哪个控制器ApiTest。所以,我有以下路线:

    Dim r1 = routes.MapRoute _
        (
            "DefaultWebApiTest",
            "api/test/{controller}/{action}",
            {"MyApp.Controllers.Api.Test"}
        )

    Dim r2 = routes.MapHttpRoute _
    (
        "DefaultWebApi",
        "api/{controller}/{action}"
    )

但我最近需要添加一个RouteHandler,然后告诉路线:

    r2.RouteHandler = New HyphenatedRouteHandler  <--this is causing trouble

一旦我这样做,就打破了命名空间;过去/api/product/{action}的{​​{1}}请求已经开始转到MyApp.Controllers.Api.ProductController,这是完全错误的。

我知道我可以通过更改控制器名称来避免这种情况,因此没有碰撞,需要明确的命名空间,但我并不是真的想要,而且我想了解它们是什么继续在这里。

1 个答案:

答案 0 :(得分:0)

事实证明我的HyphenatedRouteHandler继承自MvcRouteHandler,似乎MvcRouteHandler只查找Controller类型和ApiController。所以只看到我的Api.Test控制器,因为Api控制器的时间错误。

如果您意识到Api和Mvc通常在这样的方式上有所不同,这是合理的,除了有很多方法它们共享相同的功能,并且并不总是很明显哪个是哪个。这花了我一整天的故障排除才弄明白。

如果您想要为WebApi而不是MVC设置路由处理程序,则需要从 HttpControllerRouteHandler 继承处理程序。