【问题标题】:Routing for executing different GET methods with same type of parameter使用相同类型参数执行不同 GET 方法的路由
【发布时间】:2016-10-18 13:58:32
【问题描述】:

有人可以帮我做路由吗?

WebApiConfig 我有这个映射

config.Routes.MapHttpRoute(DefaultApi",
    routeTemplate: "{controller}/{uid}",
    defaults: new {uid = RouteParameter.Optional}
);

以及控制器中的两个方法

[RoutePrefix("AppartmentCategory")]
public class AppartmentCategoryController : ApiController
{
    [HttpGet]
    public IHttpActionResult Get(Guid uid){...}

    [HttpGet]
    [Route("{propertyUid?}")]
    public IHttpActionResult GetList(Guid propertyUid){...}
}

当我尝试发送请求时

1. http://.../AppartmentCategory/043F61D1-7194-E611-A98B-9C5C8E0005FA

2. http://.../AppartmentCategory/?propertyUid=2fdc968d-0192-e611-a98b-9c5c8e0005fa

在这两种情况下都执行方法 public IHttpActionResult GetList(Guid propertyUid)

为第一个请求执行 public IHttpActionResult Get(Guid uid) 方法需要解决什么问题?

【问题讨论】:

  • 您正在混合使用基于约定的路由和属性路由。 config.MapHttpAttributeRoutes() 在约定路线之前映射(应该如此),因此它将首先到达GetLists。从技术上讲,这两个动作都有相似的路线。您应该尝试进一步区分这两个操作。

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


【解决方案1】:

您正在混合使用基于约定的路由和属性路由。 config.MapHttpAttributeRoutes() 在基于约定的路由之前映射(应该如此)

config.MapHttpAttributeRoutes();

config.Routes.MapHttpRoute(DefaultApi",
    routeTemplate: "{controller}/{uid}",
    defaults: new {uid = RouteParameter.Optional}
);

所以它会首先击中GetLists,因为匹配模板时第一场比赛总是获胜。从技术上讲,这两个动作都有相似的路线。

[RoutePrefix("AppartmentCategory")]
public class AppartmentCategoryController : ApiController
{
    //GET AppartmentCategory/043F61D1-7194-E611-A98B-9C5C8E0005FA VIA CONVENTION-BASED ROUTING
    [HttpGet]
    public IHttpActionResult Get(Guid uid){...}

    //GET AppartmentCategory/2fdc968d-0192-e611-a98b-9c5c8e0005fa VIA ATTRIBUTE ROUTING    
    [HttpGet]
    [Route("{propertyUid?}")]
    public IHttpActionResult GetList(Guid propertyUid){...}
}

您应该尝试进一步区分这两个操作,并且尽量不要在同一个控制器中混合使用基于约定的路由和属性路由。

[RoutePrefix("AppartmentCategory")]
public class AppartmentCategoryController : ApiController {
    //GET AppartmentCategory/043F61D1-7194-E611-A98B-9C5C8E0005FA
    [HttpGet]
    [Route("{uid:guid}")]
    public IHttpActionResult Get(Guid uid){...}

    //GET AppartmentCategory?propertyUid=2fdc968d-0192-e611-a98b-9c5c8e0005fa
    [HttpGet]
    [Route("")]
    public IHttpActionResult GetList(Guid propertyUid){...}
}

【讨论】:

  • 非常感谢您对我的问题的解释和解决!
猜你喜欢
  • 2015-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-21
  • 2016-07-30
  • 1970-01-01
  • 2020-10-17
  • 1970-01-01
相关资源
最近更新 更多