与请求匹配的多个操作

时间:2013-09-19 20:30:31

标签: asp.net-web-api

我在WebApiConfig.cs中定义了以下2个路由:

    config.Routes.MapHttpRoute(
        name: "DefaultApiWithAction",
        routeTemplate: "api/{controller}/{action}/{id}"
    );

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

在服务器上有这两种方法:

public IEnumerable<SampleForm> Get()
{
    // do stuff
}

public IEnumerable<SampleForm> GetSampleFormsByState([FromUri]string[] state)
{
    // do stuff
}

我收到错误'找到了与请求匹配的多个操作',并指出了这两种方法。请求是这样的:

http://localhost/tracker/api/sampleform?state[]=pending&state[]=rejected&state[]=removed

所以这是有趣的事情......如果我改变第二种方法:

public IEnumerable<SampleForm> GetSampleFormsByState(string state)
{
    // do stuff
}

并提出如下请求:

http://localhost/tracker/api/sampleform?state=pending

没有问题。

发生了什么事?什么是导致我的路由失败的数组?我需要做什么?

1 个答案:

答案 0 :(得分:0)

string[]是一种复杂类型。这就是你必须使用[FromUri]来使绑定工作的原因。因此,Web API可以选择以下两种方法来处理具有复杂类型参数绑定的HTTP GET。

public IEnumerable<SampleForm> Get() { }
public IEnumerable<SampleForm> GetSampleFormsByState([FromUri]string[] state) { }

将其中一个签名更改为string(一种简单类型)后,您不再需要两种针对复杂类型的GET方法,并且Web API可以选择操作方法而不会产生任何混淆。

要解决此问题,您可以只定义一个操作方法来处理GET。

public IEnumerable<SampleForm> Get([FromUri]string[] state) { }

在操作方法中,只需检查state != null && state.Length > 0以使用过滤器中请求的状态数据。