用于执行具有相同参数类型的不同GET方法的路由

本文关键字:GET 路由 方法 类型 参数 执行 用于 | 更新日期: 2023-09-27 18:13:38

有谁能帮我一下路由吗?

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)

我应该修复执行公共IHttpActionResult Get(Guid uid)方法的第一个请求?

用于执行具有相同参数类型的不同GET方法的路由

您正在混合基于约定的路由和属性路由。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){...}
}