WebApi使用GetAll()和GetByIds(int [] ids)找到多个操作

Lev*_*kon 8 c# parameterbinding asp.net-web-api asp.net-web-api-routing

使用标准路线:

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
Run Code Online (Sandbox Code Playgroud)

通过这些行动:

public class ValuesController : ApiController
{
    // GET api/values
    public string GetAll()
    {
        return "all";
    }

    // GET api/values/5
    public string GetById(int id)
    {
        return "single";
    }

    // GET api/values?ids=1&ids=2
    public string GetByIds([FromUri] int[] ids)
    {
        return "multiple";
    }
Run Code Online (Sandbox Code Playgroud)

并向/ api/values发出请求,我得到以下异常:

Multiple actions were found that match the request: 
System.String GetAll() on type MvcApplication4.Controllers.ValuesController
System.String GetByIds(Int32[]) on type MvcApplication4.Controllers.ValuesController
Run Code Online (Sandbox Code Playgroud)

我一直在试着寻找解决方案.我相信GetAllGetByIds操作在这里被认为是Multiple,但它们不是因为GetByIds具有不同的签名.

有没有解决这个问题,不涉及添加{action}到路线?

Lev*_*kon 6

感谢大家的意见和建议.在踢开选项之后,我发现这样做的唯一方法是组合GetAll和GetByIds操作并切换id的长度.

public class ValuesController : ApiController
{
    // GET api/values/5
    public string GetById(int id)
    {
        return "single";
    }

    // GET api/values
    // GET api/values?ids=1&ids=2
    public string GetByIds([FromUri] int[] ids)
    {
        switch (ids.Length)
        {
            case 0:
                return "all";

            default:
                return "multiple";
        }
    }
Run Code Online (Sandbox Code Playgroud)