如何在一个控制器中调用三个get方法?

时间:2017-02-25 05:58:10

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

您好我正在开发webapi应用程序,我在一个控制器中有三个GET方法。我可以调用2种方法但第三种方法我无法调用。

以下是我可以致电的方法。

[HttpGet]
[Route("me")]
public HttpResponseMessage me()
{
    return Request.CreateResponse(HttpStatusCode.OK, "Get me");
}
URL:http://localhost:22045/api/user/me

[HttpGet]
public HttpResponseMessage getUser(int id)
{
    return Request.CreateResponse(HttpStatusCode.OK, "Get user");
}

URL: http://localhost:22045/api/user/1

我无法打电话给下面的人。

[Route("user/{role}")]
public HttpResponseMessage Get(string role)
{
    return Request.CreateResponse(HttpStatusCode.OK, "Get me on role");
}

我想称之为

http://localhost:22045/api/user/OptionalRoleParameter

我可以在这里得到一些帮助吗?任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:3)

  

可选路由参数为string

[Route("user/{role?}")]
public HttpResponseMessage Get(string role)
{
    return Request.CreateResponse(HttpStatusCode.OK, "Get me on role");
}

您不能将string作为可选参数,因为 Web API 中不支持它作为可以为空的约束,有关详细信息,请参阅此内容{{1} 3}}

答案 1 :(得分:2)

使用具有路径约束的属性路由应该有助于区分路由以避免冲突

首先确保启用了属性路由。

config.MapHttpAttributeRoutes();

然后确保控制器具有必要的属性

[RoutePrefix("api/user")]
public class UsersController : ApiController {

    //GET api/user/me
    [HttpGet]
    [Route("me")]
    public HttpResponseMessage me() {
        return Request.CreateResponse(HttpStatusCode.OK, "Get me");
    }

    //GET api/user/1
    [HttpGet]
    [Route("{id:int")] // NOTE the parameter constraint
    public HttpResponseMessage getUser(int id) {
        return Request.CreateResponse(HttpStatusCode.OK, "Get user");
    }   

    //GET api/user
    //GET api/user/OptionalRoleHere
    [HttpGet]
    [Route("{role?}")] //NOTE the question mark used to identify optional parameter
    public HttpResponseMessage Get(string role = null) {
        return Request.CreateResponse(HttpStatusCode.OK, "Get me on role");
    }
}

来源:Attribute Routing in ASP.NET Web API 2 : Route Constraints