Web API多个使用int []无法正常工作

时间:2016-12-05 08:31:58

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

在我的Web API项目中,我有一个API控制器 - ValuesController

在值控制器中,我有以下操作:

    public IHttpActionResult Get()
    {
        var result = new string[] { "value1", "value2" };
        return Json(result);
    }

    public IHttpActionResult Get(int id)
    {
        var data = new string[] { "value1", "value2" };
        return Json(data);
    }

动作方法中的代码只是虚拟的。 当我尝试以下URL时,这些操作方法很受欢迎,并且工作正常: http://localhost:25901/api/values http://localhost:25901/api/values/1

现在我添加以下操作方法:

    public IHttpActionResult Get([FromUri] int[] idList)
    {
        var data = new string[] { "value1", "value2" };
        return Json(data);
    }

现在,当我点击以下网址时: http://localhost:25901/api/values 我收到以下错误:

  

{"消息":"发生了错误。"," ExceptionMessage":"多个   找到与请求匹配的操作:\ r \ n获取类型   WebAPITryouts.Controllers.ValuesController \ r \ n获取类型   WebAPITryouts.Controllers.ValuesController"" ExceptionType":" System.InvalidOperationException""堆栈跟踪":"   在   System.Web.Http.Controllers.ApiControllerActionSelector.ActionSelectorCacheItem.SelectAction(HttpControllerContext   controllerContext)\ r \ n at   System.Web.Http.Controllers.ApiControllerActionSelector.SelectAction(HttpControllerContext   controllerContext)\ r \ n at   System.Web.Http.ApiController.ExecuteAsync(HttpControllerContext   controllerContext,CancellationToken cancellationToken)\ r \ n at   System.Web.Http.Dispatcher.HttpControllerDispatcher.d__1.MoveNext()"}

webApi配置如下:

    public static void Register(HttpConfiguration config)
    {
        // Web API configuration and services
        config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new System.Net.Http.Headers.MediaTypeHeaderValue("text/html"));
        // Web API routes
        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }

请咨询

1 个答案:

答案 0 :(得分:0)

据我了解,您希望传递一些ID来过滤所有值。目前的问题是,从路由的角度来看,您有两个映射到完全相同路由的操作:

api/values

没有idList参数的路线。因此idList不会影响路由。你有两种可能的解决方案。

  1. 您可以保留两种方法,但教导路由以区分它们。
  2. 您只能使用一种方法,并使用idList作为可选过滤器。
  3. 我个人更喜欢第二种解决方案。

        [ResponseType(typeof(IEnumerable<string>))]
        public async Task<IHttpActionResult> Get([FromUri] int[] idList)
        {
            var values = Enumerable.Range(1, 10);
            if (idList.Any()) // use optional filter e.g. pass to repository
                values = values.Where(i => idList.Contains(i));
    
            return Ok(values.Select(i => $"value{i}").ToList());
        }
    

    还考虑使用自定义模型绑定器将数组作为逗号分隔值传递。