2015-03-18 5 views
0

Я создал простую функцию ApiController whit 3.WebApi конфликтует с вызовами функций, игнорирует имена функций

  • прибудет() // Получить весь
  • ПОЛУЧИТЬ (INT идентификатор) // Получить по идентификатору
  • GetFirst() // получить первые в списке

У меня есть 2 сценария и я буду очень признателен за правильное объяснение.

  • 1: Если я реализую только get() и get(int id) он работает идеально, когда я взываю к api/controller/{id} (ID опционально)

  • 2: Когда у меня есть 3 функции, когда я пытаюсь получить доступ к api/controller/function/{id} (id необязательно), он не работает. Работает только функция для получения по id. вы можете увидеть ошибку, которую я получаю ниже.

    Запрос недействителен. Словарь параметров содержит нулевую запись для параметра «id» типа, отличного от nullable, «System.Int32» для метода «Practica.Models.Person GetById (Int32)» в «Practica.Controllers.PersonController». Необязательный параметр должен быть ссылочным типом, нулевым типом или объявлен как необязательный параметр.

Api Класс:

класс PersonController общественности: ApiController { частное лицо [] listPerson;

public PersonController() { 
     listPerson = new Person[3]; 
     listPerson[0] = new Person { 
      id = 1, 
      firstName = "test", 
      lastName = "test", 
      email = "[email protected]", 
      age = 26 
     }; 
     listPerson[1] = new Person 
     { 
      id = 2, 
      firstName = "test", 
      lastName = "test", 
      email = "[email protected]", 
      age = 26 
     }; 
     listPerson[2] = new Person 
     { 
      id = 3, 
      firstName = "test", 
      lastName = "test", 
      email = "[email protected]", 
      age = 26 
     }; 
    } 

    public Person GetById(int id) { 
     try 
     { 
      var person = this.listPerson.Where(p => p.id == id).FirstOrDefault(); 
      if (person != null) 
      { 
       return person; 
      } 
      else { 
       throw new InvalidOperationException(); 
      } 
     } 
     catch (Exception) { 
      throw new HttpResponseException(HttpStatusCode.NotFound); 
     } 
    } 

    public Person[] Get() 
    { 
     try 
     { 
      if (this.listPerson != null) 
      { 
       return this.listPerson; 
      } 
      else 
      { 
       throw new InvalidOperationException(); 
      } 
     } 
     catch (Exception) 
     { 
      throw new HttpResponseException(HttpStatusCode.NotFound); 
     } 
    } 

    public Person GetFirst() 
    { 
     try 
     { 
      if (this.listPerson != null) 
      { 
       return this.listPerson.Where(x=>x.Equals(1)).FirstOrDefault(); 
      } 
      else 
      { 
       throw new InvalidOperationException(); 
      } 
     } 
     catch (Exception) 
     { 
      throw new HttpResponseException(HttpStatusCode.NotFound); 
     } 
    } 
} 

WebApiConfig:

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 
    } 
} 

Это как ApiController распознают только ГЭТ и получить идентификатор, так что кто-то может объяснить мне, почему и как решить эту проблему?

Благодаря метод

+0

вы можете использовать атрибут маршрут на каждой функции – MustangManiac

+0

то, что вы имеете в виду именно? – gon250

+1

http://stackoverflow.com/questions/9569270/custom-method-names-in-asp-net-web-api – Prashant

ответ

1

Пользовательские именование asp.net Web API.

По умолчанию конфигурации маршрутов следуют соглашениям RESTful из GET, POST, PUT, Delete.

Custom method names in ASP.NET Web API

пройти через этот пост будет решить вашу проблему.

Должен работать, используя код, приведенный ниже, просто добавив {действие}

routes.MapHttpRoute(
    name: "DefaultApi", 
    routeTemplate: "api/{controller}/{action}/{id}", 
    defaults: new { action = "get", id = RouteParameter.Optional } 
); 
Смежные вопросы