Web API路由无法识别参数

时间:2017-01-12 17:20:25

标签: c# asp.net-web-api asp.net-web-api-routing asp.net-apicontroller

我有以下WebAPI控制器:

namespace MyApp.WebApi.Controllers
{
    [RoutePrefix("api/listing")]
    public class ListingController : ApiController
    {
        [Route("{firstparam:int?}/{nextparam:int?}")]
        public IEnumerable<ListItem> Get(int firstparam = 100, int nextparam = 12)
        {
             // firstparam is always 100, and nextparam is always 12

但是,我已尝试指定网址:

http://localhost:56004/#/listing?firstparam=2

如果我指定这样的网址:

http://localhost:56004/#/listing/2

然后它打破了路由。

显然,我错过了有关路由的内容;请有人指出我正确的方向吗?

2 个答案:

答案 0 :(得分:1)

您正在使用多个可选参数,这些参数不适用于routeTemplates。通常,最后一个参数往往是可选参数。

文档:Attribute Routing in ASP.NET Web API 2: Optional URI Parameters and Default Values

首先确保启用属性路由

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // Attribute routing.
        config.MapHttpAttributeRoutes();

        // Convention-based routing.
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}

获得你的目标

[RoutePrefix("api/listing")]
public class ListingController : ApiController {

    //GET api/listing
    //GET api/listing?firstparam=x
    //GET api/listing?nextparam=y
    //GET api/listing?firstparam=x&nextparam=y
    [HttpGet]
    [Route("")]
    public IEnumerable<ListItem> Get(int firstparam = 100, int nextparam = 12) { ... }
}

多个内联参数是可选的问题是路由器不知道使用哪个,这就是为什么它们往往位于URL的末尾。

然而,为了让它们像您在示例中提到的那样内联,您将需要多条路线。

[RoutePrefix("api/listing")]
public class ListingController : ApiController {

    //GET api/listing
    [HttpGet]
    [Route("")]
    public IEnumerable<ListItem> Get() { return Get(100, 12);  }

    //GET api/listing/2
    //GET api/listing/2/5
    [HttpGet]
    [Route("{firstparam:int}/{nextparam:int?}")]
    public IEnumerable<ListItem> Get(int firstparam, int nextparam = 12) { ... }
}

答案 1 :(得分:0)

您可以尝试在Get()方法的参数内使用[FromUri]属性来提取传递到“/ listing”uri的任何查询参数以及由int属性firstparam和secondparam组成的类。 / p>

namespace MyApp.WebApi.Controllers
{
    [RoutePrefix("api/listing")]
    public class ListingController : ApiController
    {
        [Route("")]
        [HttpGet]
        public IEnumerable<ListItem> Get([FromUri] ClassRepresentingParams params)
        {

希望这有帮助。