如何使用Route属性将查询字符串与Web API绑定?

时间:2017-02-13 08:50:34

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

我正试图让它发挥作用:

[Route("api/Default")]
public class DefaultController : ApiController
{
    [HttpGet, Route("{name}")]
    public string Get(string name)
    {
        return $"Hello " + name;
    }
}

通过调用此http://localhost:55539/api/Default?name=rami但无效,请尝试此操作:http://localhost:55539/api/Default/Hello?name=rami,此操作无效:http://localhost:55539/api/Default/Hello/rami

2 个答案:

答案 0 :(得分:7)

确保在WebApiConfig.cs中启用了属性路由

config.MapHttpAttributeroutes();

ApiController动作可以分配多条路线。

[RoutePrefix("api/Default")]
public class DefaultController : ApiController {

    [HttpGet]
    //GET api/Default
    //GET api/Default?name=John%20Doe
    [Route("")]
    //GET api/Default/John%20Doe
    [Route("{name}")]
    public string Get(string name) {
        return $"Hello " + name;
    }
}

还可以选择使参数成为可选参数,然后允许您使用inline参数调用URL,并让路由表使用类似于在基于约定的路由中完成的查询字符串。

[RoutePrefix("api/Default")]
public class DefaultController : ApiController {

    [HttpGet]
    //GET api/Default
    //GET api/Default?name=John%20Doe 
    //GET api/Default/John%20Doe
    [Route("{name?}")]
    public string Get(string name = null) {
        return $"Hello " + name;
    }
}

答案 1 :(得分:1)

在Web API中,首先发生路由模板匹配,然后执行动作选择过程。

你的C#应该是这样的:

public class DefaultController : ApiController
{
    [HttpGet] 
    [Route("api/Default/{name}")]
    public string Get(string name)
    {
        return $"Hello " + name;
    }
}

现在打电话应该是这样的:

http://localhost:55539/api/Default/Get?name=rami