我正在尝试在我的控制器中使用两个Web API方法。一个用于在标题中使用MyViewModel
对象调用GET时,一个没有。
MyController.cs:
[Produces("application/json")]
[Route("api/[controller]")]
public class MyController : Controller
{
[HttpGet]
public IEnumerable<UserModel> Get()
{
// ...
}
[HttpGet]
public IEnumerable<UserModel> Get(MyViewModel viewModel)
{
// ...
}
}
但是,浏览到Chrome中的路线地址而不传递任何MyViewModel
会出现此错误:
AmbiguousActionException:匹配多个动作。下列 动作匹配路线数据并满足所有约束条件:
MyController.Get(MyProject)
MyController.Get(MyProject)
如果我注释掉无参数方法并在参数化函数中放置一个断点并浏览到api URL,它看起来像viewModel
那样null
就像我预期的那样,它似乎是一个使用无参数构造函数创建的新MyViewModel
对象。似乎它可能与我的问题有关。
我正在 Microsoft.AspNetCore v1.1.2 和 Microsoft.AspNetCore.Mvc v1.1.3 上运行。
答案 0 :(得分:2)
将属性路由添加到其中一个。 例如:
[HttpGet("/myaction")]
public IEnumerable<UserModel> Get(MyViewModel viewModel)
{
// ...
}
或者将它添加到所有这些中。 MVC无法区分两种方法,因为viewModel
可以为null,并且不知道它是否应该首先匹配get action
或其他方法。
答案 1 :(得分:1)
默认情况下,ASP.NET Core中的一个用于在标题中使用MyViewModel对象调用GET时,一个没有。
Model Binding使用查询参数作为模型填充的来源,而不是标题。如果您需要填充标题中的MyViewModel
,请使用[FromHeader]
属性:
public IEnumerable<UserModel> Get([FromHeader] MyViewModel viewModel)
ASP.NET Core routing实现不使用标头进行路由解析。当您使用属性路由时,正如@Vlado所说,您需要使用不同的路由名称来消除歧义操作。