Asp.Net WebApi - 找到了与请求匹配的多个操作

时间:2016-12-18 21:15:00

标签: asp.net asp.net-web-api2

将routeTemplate定义为" api / {controller} / {id}"并在我的控制器中使用以下方法(ValuesController)

    [HttpGet]
    public IEnumerable<string> GetX()
    {
        return new string[] { "xx1", "xx2" };
    }

    [HttpGet]
    public IEnumerable<string> GetY([FromUri]Customer c)
    {
        return new string[] { "c1", "c2" };
    }

     public class Customer
     {
        public bool IsMarried { get; set; }
        public string CustName { get; set; }
     }

使用网址 - &#34; / api / values?IsMarried = false&amp; CustName = aa&#34;导致错误 - &#34;发现多个匹配请求的操作...&#34; 。            如果不将routeTemplate更改为&#34; api / {controller} / {action} / {id}&#34;,我就无法解决上述问题。           如果有人知道如何在不改变routeTemplate的情况下修改上述内容。

3 个答案:

答案 0 :(得分:1)

使用简单类型并将它们映射到控制器中:

[HttpGet]
public IEnumerable<string> GetY(bool IsMarried, string CustName)
{
    var cust = new Customer {IsMarried = IsMarried, CustName = CustName};
    return new string[] { "c1", "c2" };
}

请注意,您将丢失ModelState.IsValid等功能,因此您需要手动调用验证程序。

查看Action Selection部分,了解它对简单和复杂参数的工作原理。

答案 1 :(得分:1)

解决方案一:路由

[RoutePrefix("api")]
public class FooController : ApiController
{
    [Route("Foo/getall")]
    [HttpGet]
    public IEnumerable<string> GetX()
    {
        return new string[] { "xx1", "xx2" };
    }

    [Route("foo/search")]
    [HttpGet]
    public IEnumerable<string> GetY([FromUri]Customer c)
    {
        return new string[] { "c1", "c2" };
    }

    public class Customer
    {
        public bool IsMarried { get; set; }
        public string CustName { get; set; }
    }
}

请记住添加属性路由映射:

configuration.MapHttpAttributeRoutes();

解决方案二:可选参数

[RoutePrefix("api")]
public class FooController : ApiController
{
    [HttpGet]
    public IEnumerable<string> GetY([FromUri]Customer c)
    {
        if(c == null)
           // no parameters where set.

        if(c.IsMarried != null)
           // do stuff
        // etc....
        return new string[] { "c1", "c2" };
    }

    public class Customer
    {
        public bool? IsMarried { get; set; }
        public string CustName { get; set; }
    }
}

答案 2 :(得分:1)

如果你不能指定动作名称,那么你有两个选择。

基于参数的行动

创建一个带有默认值(引用类型为null)参数的重载。根据参数的状态,执行approriate操作。由于您的样本非常抽象,我不知道这是否适合您。

return new LogoList(input1);

新控制器

创建一个新的Controller并在那里定义您的附加操作。如果行为本质上非常不同,这可能是更好的解决方案。此处不需要代码示例,只需创建一个新控制器并移动现有方法。