【问题标题】:Area webapi route not being resolved区域 webapi 路由未解析
【发布时间】:2016-08-11 13:14:59
【问题描述】:

我正在尝试测试我的管理区域中存在的 Web api 路由。

这是该地区的路线定义

    [HttpPut]
    [Route("timezone/put/{timezone}", Name = "PutTimeZone")]
    [AllowAnonymous]
    [ResponseType(typeof(void))]
    public IHttpActionResult PutTimeZone(string timezone)
   {
     /*Action body*/
   }

我有一个这样的路由前缀 [RoutePrefix("admins/misc")]

这是我的路线测试

 const string route = "/admins/misc/timezone/put/-120";
        RouteAssert.HasApiRoute(_httpConfiguration, route, HttpMethod.Put);

        _httpConfiguration.ShouldMap(HttpMethod.Put, route)
            .To<MiscApiController>(HttpMethod.Put, x => x.PutTimeZone("-120"));

当我运行测试时,我得到MvcRouteTester.Assertions.AssertionException : Expected 'Administration', got no value for 'area' at url '/admins/misc/timezone/put/-120'.

我在route tester wiki page读到

如果你使用的是 MVC 领域,那么只要你使用标准 命名空间的布局,区域名称将从您的 控制器类型名称并针对路由选择的区域进行测试。 例如如果您的控制器的完全限定类型名称是 MyWebApp.Areas.Blog.CommentController 那么预期的区域名称将 成为“博客”。

但坦率地说,它并没有给我任何线索,让我知道该怎么做才能让我的测试通过。我的问题是我错过了什么?

【问题讨论】:

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


    【解决方案1】:

    尝试将[RoutePrefix("admins/misc")] 替换为[RouteArea("Administration",AreaPrefix = "admins/misc")] 或将两者与[RouteArea("Administration",AreaPrefix = "admins"),RoutePrefix("misc")] 结合使用。

    编辑: 我下载了 MvcRouteTester 库的源代码并尝试使用与您提供的几乎相同的示例对其进行调试,但看起来库本身存在问题。

    细节:一种方法Common.Verifier.VerifyExpectations断言预期区域expected.Area与路由的实际区域actual.Area匹配,但之前没有将实际区域属性设置为任何值的代码(尽管它确实设置了Controller和Action属性在ApiRoute.Generator.ReadRequestProperties)。

    所以我认为在当前状态下(在本文发布时),该库根本不支持WebApi 的区域。我建议您在 MvcRouteTester github 页面上打开一个带有此帖子链接的问题。

    【讨论】:

    • 但是路由区是专门为 Asp.net Mvc 设计的,似乎没有 Webapi 变种,适合在 webapi 控制器内部使用
    • 无论如何都试过了,但测试仍然失败,并出现与上图相同的异常消息。
    • 我没有意识到这一点,我不确定答案是什么,抱歉。到目前为止,我从未尝试在该区域内使用 ApiController。想到的另一件事是您的 ApiController 的命名空间是什么?如果我正确理解您提供的 wiki 文档,则预期的命名空间是 YourProjectName.Areas.Administration。你能验证一下吗?
    • 也许你是对的,将RouteAreaAttribute 用于 ApiController 是没有意义的。在这种情况下,由于 wiki 文档明确提到“如果您使用 MVC 区域...”来描述它如何与它们一起工作,那么使用带有 Web API 的区域是根本不支持。
    • 不,是的,因为它不仅适用于mvc,也适用于webapi,如果你仔细阅读,你会发现它也为webapi做了规定
    猜你喜欢
    • 1970-01-01
    • 2012-08-30
    • 2011-08-07
    • 1970-01-01
    • 1970-01-01
    • 2015-09-09
    • 1970-01-01
    • 2013-03-12
    相关资源
    最近更新 更多