2013-08-20 3 views
0

У меня есть эта интересная ситуация, когда у меня есть baseController для webApi и отследил проблему до этого. Если у меня есть базовый контроллер, который имеет входной параметр типа объекта он будет в конечном итоге с HTTP 500 нескольких действий, где найдены ...Параметр ввода BaseController Объект результаты Несколько действий были найдены, которые соответствуют запросу

И это в по умолчанию пустой MVC 4.0 проект против 2012 с использованием IISExpress

public class BaseSecureApi : ApiController 
{ 
    public string Wtf(object ohMyGodThisIsSilly) 
    { 
     return null; 
    } 

} 

И контроллер

public class Default1Controller : BaseSecureApi 
{ 
    // GET api/default1 
    public IEnumerable<string> Get() 
    { 
     return new string[] { "value1", "value2" }; 
    } 

    // POST api/default1 
    [HttpPost] 
    public string Post([FromBody]string value) 
    { 

     return "Postmyvalue:" + value; 
    } 
} 

И маршрут

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

Теперь почему маршрутизация идет с трудом. IRL базовый класс возвращает httpResponse на основании того, кто входит в систему, и если результат должен быть зашифрован или нет.

+0

Я попытался воспроизвести, используя опубликованный код, но я не получаю результат. Я получаю тот же результат, если я переименую метод Wtf в GetWtf. –

+0

В какой среде вы используете @ OlavNybø? Просто проверил мой тестовый проект, и он сработает. – Archlight

+0

Я получаю те же результаты, что и при публикации, сначала я попробовал получить. –

ответ

1

С routing-and-action-selection article на сайте ASP.NET:

Методы HTTP. Рамки только выбирает действия, которые соответствуют метод HTTP запроса, определяется следующим образом:

  1. Вы можете указать метод HTTP с атрибутом: AcceptVerbs, HttpDelete, HttpGet, HttpHead, HttpOptions, HttpPatch, HttpPost или HttpPut ,
  2. В противном случае, если имя метода контроллера начинается с «Get», «Post», «Put», «Delete», «Head», «Options» или «Patch», то по соглашению действие поддерживает это HTTP.
  3. Если ничего из вышеперечисленного, метод поддерживает POST.

Это означает, что метод Wtf будет поддерживать POST, потому что это открытый метод, без атрибутов и не начинается с какой-либо из обычных слов.

Если вы сделаете метод Wtf защищенным и он не будет вызываться веб-api, вы все равно можете вызвать его из методов ваших производных классов, где вам нужно.

+0

Да понял. Но ПОЧЕМУ он это делает ???? – Archlight

+0

Ahhh Я прочитал статью, но пропущен пункт nr3 ... Если все остальное не получилось, оно поддержит POST. Кто-то должен быть сильно разбит по заднице для этого else/default заявления. И для других это может помочь. http://blogs.msdn.com/b/webdev/archive/2013/04/04/debugging-asp-net-web-api-with-route-debugger.aspx. Это отладчик маршрута. – Archlight

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