2

嗨我正在开发webapi应用程序,我有一个控制器中的三个GET方法。我可以调用2种方法,但是我无法调用第三种方法。如何在一个控制器中调用三个get方法?

以下是我可以调用的方法。

[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

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

首先确保启用属性路由。

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

+0

谢谢。有效。 –

3

可选路径参数为string

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

你不能有string作为可选的参数,因为它不支持作为在的Web API可空的约束,看到这更多信息, Route Constraints in Web API

+0

谢谢。有没有其他方法可以解决这个问题? –

+0

您可以编写一个自定义的路线限制。我在答案中给出的链接中提供了一个示例 –

相关问题