在.NET Core MVC上创建歧义路由

时间:2019-03-26 15:17:23

标签: asp.net-core-mvc

我曾经有一个NET Web API(4.6.2)应用程序,该应用程序具有一些模糊的路由。像这样:

[RoutePrefix(RoutePrefix)]
public class TestController : ApiController
{
public const string RoutePrefix = "test";

[HttpGet, Route("")]
public IHttpActionResult GetAll(Guid uid, [FromUri]int limit, [FromUri]int offset)
{
  // Logic Here.
}

[HttpGet, Route]
public async Task<IHttpActionResult> Test([FromUri]Guid id, [FromUri]int? limit = null, [FromUri]int? offset = null)
{
  // Logic Here.
}
}

所有这些过去都是有效的,因为我在“启动”中有此设置:

config.MapHttpAttributeRoutes();

问题是我正在将此API转换为NET Core MVC API,并且 MapHttpAttributeRoutes 设置不再可用。这意味着现在我在某些操作上存在一些歧义性问题(例如上述操作)。

我知道一种解决方法(将来我想这样做)是为每个操作指定一条特定的路线。此时,基于此API的用法,我无法更改所有路由。有了这些,我想知道是否有人找到了一种无需改变路线即可处理这种情况的方法?

谢谢你们。

1 个答案:

答案 0 :(得分:1)

据我所知,ASP.NET Core不支持歧义路由,实际上甚至更高版本的Web Api也不支持歧义路由。在ASP.NET Core中,特别是路由短路,因此它将始终采用第一个可行的方法,而不考虑其他任何方法。您唯一的选择是为每个动作分配唯一的路由,或将两个动作的逻辑组合为一个动作。

也就是说,为什么在这里首先要执行两个不同的操作并没有意义。两者之间没有功能上的区别,除了第一个将填充参数中的默认值,而第二个将填充null。默认情况下,所有操作参数都是可选的。如果绑定请求中没有任何内容,模型绑定程序将自动将default / null绑定到每个参数。如果您希望最后两个参数可为空,则只需使用该签名,然后就可以在操作中分支是否或他们没有价值。