Asp.net web api 与请求匹配的多个操作

Asp.net web api 与请求匹配的多个操作,asp.net-web-api,Asp.net Web Api,我在WebApiConfig.cs中定义了以下两条路由: config.Routes.MapHttpRoute( name: "DefaultApiWithAction", routeTemplate: "api/{controller}/{action}/{id}" ); config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api

我在WebApiConfig.cs中定义了以下两条路由:

    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
}
所以这里有一件有趣的事。。。如果我将第二种方法更改为:

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

发生了什么事?阵列的哪些方面导致路由失败?我需要做什么?

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

public IEnumerable<SampleForm> Get() { }
public IEnumerable<SampleForm> GetSampleFormsByState([FromUri]string[] state) { }
在操作方法中,只需检查状态!=null&&state.Length>0以使用筛选器中请求的状态数据。

我最终实现了IHttpRouteConstraint,但这也是一个很好的解决方案。
http://localhost/tracker/api/sampleform?state=pending
public IEnumerable<SampleForm> Get() { }
public IEnumerable<SampleForm> GetSampleFormsByState([FromUri]string[] state) { }
public IEnumerable<SampleForm> Get([FromUri]string[] state) { }