我在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
没有问题。
发生了什么事?什么是导致我的路由失败的数组?我需要做什么?
答案 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
以使用过滤器中请求的状态数据。