映射以特定URL部分/关键词开头的所有路由

15

我正在为我的个人库构建各种单元测试的测试中心,并希望有一个易于访问的测试API路由。因此,我在我的路由配置中有两个条目:默认和自定义路由...

routes.MapRoute(
            name:="Default",
            url:="{controller} / {Action} / {id}",
            defaults:=New With {.controller = "Home", .action = "Index", .id = UrlParameter.Optional}
        )

        routes.MapHttpRoute(
                name:="UnitTests",
                routeTemplate:="test/{category}/{testname}",
                defaults:=New With {.controller = "TestApis", .action = "testme",
                .category = "TestCategoryOne", .testname = UrlParameter.Optional}
            )

我的想法是,每当我想调用我的测试API控制器时,我只需在URL前加上“test /”,它就会知道将其重定向到我的“TestApisController”。但似乎它已经破坏了我的默认路由。

问题

有没有一种方法可以将所有以“test /”开头的路由映射到特定的控制器,同时不破坏我的默认路由?

编辑

所以过了一段时间后,我意识到这种方法无法工作的原因与路由无关。 我在“WebApiConfig”文件中定义了另一个默认的API路线,这导致了一些问题。 很抱歉,我还在从Webforms过渡到MVC。


我有点困惑,MVC 6 中似乎没有 MapHttpRoute?我所知道的最接近的方法是添加 Microsoft.AspNet.Mvc.WebApiCompatShim,它允许你使用 routes.MapWebApiRoute。无论如何,为什么不将你的路由添加为标准路由(因为你定义了控制器和操作),并在默认路由之前声明它呢(因为测试路由比默认路由更具体)? - Daniel J.G.
@DanielJ.G. 我正在使用MapHttpRoute,因为我要调用的控制器是Web API控制器。否则似乎无法工作。 - Ross Brasseaux
@DanielJ.G. 这是我关于MVC 6标签的错误。我正在使用MVC版本5.2 - Ross Brasseaux
1
您需要交换路由的顺序,以便../test/someCategory/someTestName可以进入testControllersomeCategory方法,并将someTestName传递给id参数,因为它匹配第一个(默认)路由。 - user3559349
1个回答

0

由于您要路由到的控制器是Web Api控制器,因此您需要将自定义路由放在WebApiConfig.vb文件中。该路由应该位于该文件中的默认路由之上,因为它比默认路由更具体,正如@Stephen Muecke所指出的那样。您原来的代码会有一些变化,不再使用routes.MapHttpRoute,而是使用config.Routes.MapHttpRoute,像这样:

config.Routes.MapHttpRoute( _
    name:="UnitTests", _
    routeTemplate:="test/{category}/{testname}", _
    defaults:=New With {.controller = "TestApis", .action = "testme", .category = "TestCategoryOne", .testname = UrlParameter.Optional}
)

我曾经在想要路由到特定控制器的某些情况下做过同样的事情,并在路由上包含了自定义身份验证处理程序,你正在尝试的应该可以工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接