区域webapi路由未解析

时间:2016-08-11 13:15:00

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

我正在尝试测试我的管理区域内存在的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然后预期的区域名称将   是“博客”。

但坦率地说,它并没有给我任何关于做什么的线索,以便让我的测试通过。我的问题是我错过了什么?

1 个答案:

答案 0 :(得分:1)

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

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

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

所以我认为在当前状态(在这篇文章发布时),图书馆根本不支持WebApi的区域。我建议您在MvcRouteTester github页面上打开一个问题,并附上此帖子的链接。