2016-12-05 15 views
-1

私のWeb APIプロジェクトでは、私はAPIコントローラを持っています - ValuesController。私は次のアクションを持っている値コントローラでWeb API Multiple get int [] not working

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:私は、次のURLを打ったときに今

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

http://localhost:25901/api/values http://localhost:25901/api/values/1

は、今私は、次のアクションメソッドを追加します

{"Message":"An error has occurred.","ExceptionMessage":"Multiple actions were found that match the request: \r\nGet on type WebAPITryouts.Controllers.ValuesController\r\nGet on type WebAPITryouts.Controllers.ValuesController","ExceptionType":"System.InvalidOperationException","StackTrace":" at 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の設定がFOの通りです: 私は次のエラーを取得しますllows:私はあなたがすべての値をフィルタリングするために、いくつかのIDを渡したい理解したよう

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

をアドバイスしてください。

api/values 

idListパラメータとはルートがありません:現在の問題は、ビューのルーティングポイントからあなたは正確に同じルートにマッピングする二つの作用を有することです。したがってidListはルーティングに影響しません。ここには2つの解決策があります。

  1. 両方の方法を離れることはできますが、区別するためにルーティングを教えることができます。
  2. 1つの方法だけを残して、オプションフィルタとしてidListを使用できます。

私は個人的には第2の解決策を好みます。

[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()); 
    } 

カスタムモデルのバインダーを使用して、コンマ区切りの値として配列を渡すことも考えられます。