在路由配置中使用操作时,发现多个操作与请求匹配
本文关键字:操作 请求 发现 配置 路由 | 更新日期: 2023-09-27 18:29:08
我目前正在使用Web API 2.2 构建一个API
我有RESTful部分在工作,但现在我需要一个非RESTful控制器:
public class PremisesController : ApiController
{
private PremiseService _service;
public PremisesController()
{
_service = new PremiseService();
}
[HttpGet]
public IHttpActionResult Premise(string id)
{
id = id.Replace(" ", String.Empty).ToUpper();
List<Premise> premises = _service.GetPremisesForPostcode(id);
return Ok(premises);
}
[HttpGet]
public IHttpActionResult Building(string id)
{
double premise = Convert.ToDouble(id);
Building building = _service.GetBuildingsForPremise(premise);
return Ok(building);
}
}
路由配置如下:
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
config.Routes.MapHttpRoute(
name: "ActionApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
当我启动GET操作时,我得到了一个错误,它无法区分这两种方法:
发现多个操作与请求匹配
所以我的问题是,我需要在每个方法的顶部指定Route属性吗?如果需要,为什么?第二条路线(ActionApi)不是处理这种情况吗?
编辑:
我刚刚测试了你的代码,它的工作方式…也许只是不清楚。
- /api/Premise/Premise/8-->将带您进行第一次操作
- /api/Premises/Building/8-->将带您进行第二次操作
- /api/Premises/8-->将导致错误,因为路由将通过GET请求转到第一个规则api/{controller}/{id},然后他无法区分您想要的操作,因为它们都与第一个路由匹配:(api/Premise/{id})
您也可以在控制器上使用RoutePrefix属性。
[RoutePrefix("api/premises")]
public class PremisesController : ApiController
与路由属性相结合意味着您不应该使用相同的路由