1

我在 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

没有问题。

到底是怎么回事?导致我的路由失败的阵列是什么?我需要做什么?

4

1 回答 1

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) { }

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

于 2013-09-20T04:24:46.920 回答