2013-03-08 2 views
3

Я новичок в веб-API ASP.NET, но я сталкиваюсь с проблемой, когда, если я пытаюсь добавить два метода получения к одному контроллеру, он не пытается выполнить действие. Допустим ли мы только один прием на контроллер, если мы не добавим перегрузку того же метода?Действия ASP.NET Web API - только один GET на контроллер?

Это работает, если у меня есть только один метод получения, например. первый. Как только я добавляю Получить ко второму имени метода, он дает мне 500.

[HttpGet] 
public string GetToday() 
{ 
    return "Hello today"; 
} 

[HttpGet] 
public string GetPending() 
{ 
    return "Hello Pending"; 
} 

звонков, которые я делаю: http://abc.com/api/tasks/gettoday http://abc.com/api/tasks/getpending

я могу сделать этот вызов, если имя метода просто «Сегодня», пока я помещаю атрибут [HttpGet]. Но только если у меня нет второго действия. Это означает, что если я удаляю атрибут [HttpGet] из второго метода, а также удаляю «Get» из имени метода, так что он просто Pending, то он работает.

Как только два метода получай я получаю эту ошибку:

{ «Сообщение»: «Ошибка», «ExceptionMessage»: "Несколько действий было обнаружено, что соответствует запросу: \ г \ nSystem.String TodaysTasks() для типа TaskTrackerService.Controllers.TasksController \ r \ nSystem.String PendingTasks() для типа TaskTrackerService.Controllers.TasksController "," ExceptionType ":" System.InvalidOperationException "," StackTrace ":" at System. Web.Http.Controllers.ApiControllerActionSelector.ActionSelectorCacheItem.SelectAction (HttpControllerContext controllerContext) \ r \ n в System.Web.Http.Controllers.ApiControllerActionSelector.SelectAction (HttpControllerContext controllerContext) \ r \ n в System.Web.Http.ApiController.ExecuteAsync (Контроллер HttpControllerContextContext, Cancell ationToken cancelationToken) \ r \ n в System.Web.Http.Dispatcher.HttpControllerDispatcher.SendAsyncInternal (запрос HttpRequestMessage, CancellationToken cancelationToken) \ r \ n в System.Web.Http.Dispatcher.HttpControllerDispatcher.SendAsync (запрос HttpRequestMessage, CancellationToken cancelationToken) " }

+1

У вас может быть столько действий, сколько вы хотите. Можете ли вы отправить код? – jchapa

+2

Можете ли вы показать, какие действия вы пытаетесь? У вас может быть только один GET с той же сигнатурой метода, но любое количество действий с различными именами или сигнатурами (и маршруты, указывающие на них) –

+2

Пожалуйста, разместите код, показывающий действия вашего контроллера и вашу конфигурацию маршрута – levelnis

ответ

4

Идея веб-API заключается в том, что он представляет собой ReSTful resource. В семантике REST подразумевается, что контроллер соответствует идее «resource», и это поведение определяется глаголом HTTP, используемым для доступа к ресурсу - означает GET, POST, PUT, DELETE, ...

Модель, используемая для эти ресурсы заключаются в том, что вы относитесь к ним несколько «CRUD -y»; что вы запрашиваете элементы ресурса, добавляете новые элементы в ресурс, обновляете элементы в ресурсе - вы получаете идею.

Для каждого (релевантного) глагола вы должны иметь только одно действие, которое касается запросов такого характера. Идея иметь многократные действия, к которым обращается GET, не очень перегружена и более похожа на MVC-и-стиль RPC-стиля, который не подходит для ASP.NET Web API.

Так что ваш контроллер может быть вместо этого написано:

public class FooController : ApiControlle 
{ 
    [HttpGet] 
    public Account Get(string flavour) 
    { 
     switch (flavour) { 
      case "greeting": return "Hello today"; 
      case "pending": return "Hello Pending"; 
      default: throw new InvalidOperationException("Cannot get your flavour of foo :("); 
     } 
    } 
} 

Но, как вы написали в комментариях, беда в том, что вы никогда не намеревались использовать контроллер в качестве контроллера Web API, но контроллер MVC.

+0

Я оставлю это здесь для других людей, которые, как и я, столкнулись с этим при поиске похожих, но связанных с Web API проблем. – Cornelius

Смежные вопросы