【问题标题】:Why does my RouteHandler break my route namespaces?为什么我的 RouteHandler 会破坏我的路由命名空间?
【发布时间】:2014-03-20 18:58:14
【问题描述】:

我使用的约定是,我在 /api/product/{action} 之类的 url 处有一个 web api 端点,在相应的 url 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} 的请求曾经正确路由到 MyApp.Controllers.Api.ProductController,现在开始转到 MyApp.Controllers.Api.Test.ProductController,这是完全错误的。

我知道我可以通过更改控制器名称来避免这种情况,这样就不会发生冲突并且不需要显式命名空间,但我真的不想这样做,我想了解这里发生了什么。

【问题讨论】:

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


    【解决方案1】:

    原来我的HyphenatedRouteHandler 是从MvcRouteHandler 继承的,而且MvcRouteHandler 似乎只查找Controller 类型的对象,而不是 ApiController。所以它只看到了我的Api.Test 控制器,因为Api 控制器的时间不对。

    如果您意识到 Api 和 Mvc 通常在这些方面有所不同,这是合理的,除了它们在许多方面共享相同的功能,而且并不总是很明显哪个是哪个。这花了我一整天的时间来解决问题。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-25
      • 2019-06-28
      • 2021-12-22
      • 1970-01-01
      • 1970-01-01
      • 2013-06-25
      • 2013-06-07
      相关资源
      最近更新 更多