我有这个控制器动作:
[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)?
答案 0 :(得分:3)
如果您将控制器操作设为
public IHttpActionResult GetMany([FromUri] int[] ids)
并将网址传递为:
?ids=1&ids=2&ids=3...
它应该可以在没有自定义绑定器的情况下工作