将IEnumerable <int>传递给WebApi操作

时间:2015-05-13 10:11:26

标签: c# asp.net-web-api

我有这个控制器动作:

[ActionName("GetMany")] [HttpGet]
public IHttpActionResult GetMany([FromUri] IEnumerable<int> ids)
{
    //Do something...
}

我还使用this SO question中描述的自定义模型绑定器。我的问题与此链接问题有所不同,因为即使我按照其中提供的答案进行操作,但在使用自定义ModelBinder时仍然无效,因为它会抛出下面提到的异常。

我已配置此路由:

config.Routes.MapHttpRoute(
    name: "ApiByAction",
    routeTemplate: "Api/{controller}/{action}",
    defaults: new { action = "Get" },
    constraints: null
);

在客户端,我这样做:

public IEnumerable<MyEntity> LoadMany(IEnumerable<int> ids)
{
    var url = "Api/MyEntity/GetMany?ids={0}";
    var s = HttpUtility.UrlEncode(string.Format(url, string.Join(",", ids)));

    response = client.GetAsync(HttpUtility.UrlEncode(s)).Result;

    return null; //for now 
}

然而,响应是抛出Not Found异常。

我在这里缺少什么?

修改

我删除了自定义模型绑定器的注册,并将操作更改为:

[ActionName("GetMany")] [HttpGet]
public IHttpActionResult GetMany([ModelBinder(typeof(ArrayModelBinder))] IEnumerable<int> ids)
{
    //Do something...
}

现在我得到以下例外:

  

HttpException(0x80004005):从客户端检测到一个潜在危险的Request.Path值(?)

因此,如果Url中不允许?,并且未删除验证,那么如何将数组传递给操作呢?将Get更改为Post是否有意义(为了使用request.body)?

1 个答案:

答案 0 :(得分:3)

如果您将控制器操作设为

public IHttpActionResult GetMany([FromUri] int[] ids)

并将网址传递为:

?ids=1&ids=2&ids=3...

它应该可以在没有自定义绑定器的情况下工作