我正在使用一种约定,其中我在网址如/api/product/{action}
处有一个web api端点,并在相应的网址api/test/product/{action}
处使用传统的MVC测试页面。 Api和Test有自己的命名空间,因此api控制器是MyApp.Controllers.Api.ProductController
命名空间,而测试控制器是MyApp.Controllers.Api.Test.ProductController
。
这很好,除了我需要指定名称空间以便框架在发出请求时知道要使用哪个控制器Api
或Test
。所以,我有以下路线:
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
,这是完全错误的。
我知道我可以通过更改控制器名称来避免这种情况,因此没有碰撞,需要明确的命名空间,但我并不是真的想要,而且我想了解它们是什么继续在这里。
答案 0 :(得分:0)
事实证明我的HyphenatedRouteHandler
继承自MvcRouteHandler
,似乎MvcRouteHandler
只查找Controller
类型和不 ApiController
。所以只看到我的Api.Test
控制器,因为Api
控制器的时间错误。
如果您意识到Api和Mvc通常在这样的方式上有所不同,这是合理的,除了有很多方法它们共享相同的功能,并且并不总是很明显哪个是哪个。这花了我一整天的故障排除才弄明白。
如果您想要为WebApi而不是MVC设置路由处理程序,则需要从 HttpControllerRouteHandler
继承处理程序。