在我的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 }
);
}
请咨询
答案 0 :(得分:0)
据我了解,您希望传递一些ID来过滤所有值。目前的问题是,从路由的角度来看,您有两个映射到完全相同路由的操作:
api/values
没有idList
参数的路线。因此idList
不会影响路由。你有两种可能的解决方案。
idList
作为可选过滤器。我个人更喜欢第二种解决方案。
[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());
}
还考虑使用自定义模型绑定器将数组作为逗号分隔值传递。