GET和无参数GET导致AmbiguousActionException?

时间:2017-07-25 20:04:35

标签: json asp.net-mvc asp.net-web-api asp.net-core

我正在尝试在我的控制器中使用两个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 上运行。

2 个答案:

答案 0 :(得分:2)

将属性路由添加到其中一个。 例如:

    [HttpGet("/myaction")]   
    public IEnumerable<UserModel> Get(MyViewModel viewModel)
   {
    // ...
   }

或者将它添加到所有这些中。 MVC无法区分两种方法,因为viewModel可以为null,并且不知道它是否应该首先匹配get action或其他方法。

答案 1 :(得分:1)

  

一个用于在标题中使用MyViewModel对象调用GET时,一个没有。

默认情况下,ASP.NET Core中的

Model Binding使用查询参数作为模型填充的来源,而不是标题。如果您需要填充标题中的MyViewModel,请使用[FromHeader]属性:

public IEnumerable<UserModel> Get([FromHeader] MyViewModel viewModel)

ASP.NET Core routing实现不使用标头进行路由解析。当您使用属性路由时,正如@Vlado所说,您需要使用不同的路由名称来消除歧义操作。