2013-12-13 2 views
1

Я пытаюсь что-то на веб-сайте Api. Сначала я поделюсь WebApiConfigAsp.Net Mvc Web Api Routing 404

config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional }, 
      constraints: new { id = @"^[0-9]+$" } 
     ); 

     config.Routes.MapHttpRoute(
      name: "ApiCategory", 
      routeTemplate: "api/tales/{category}/{id}", 
      defaults: new { controller = "Tales", id = RouteParameter.Optional}, 
      constraints: new { category = @"^[a-z]+$" } 
     ); 

Я прочитал эту issue и исправить свой файл apiconfig. Моя цель, как это:

  1. Список GetAllTales() = апи/сказки/-> 404 Не найдено
  2. Tale GetTale (интермедиат идентификатор) = апи/сказки/1 -> Ok!
  3. Список GetAllTalesByCategory (string categoryName) = api/tales/kids -> Хорошо!
  4. Сказка GetTalesByCategoryAndId (строка categoryName, int id) = api/tales/kids/1 -> Ok!

Если и интересно моему ApiController

[HttpGet] 
    public Tale GetAllTalesByCategoryAndId(string category, int id){} 

    [HttpGet] 
    public IEnumerable<Tale> GetAllTalesByCategory(string category){} 

    [HttpGet] 
    public IEnumerable<Tale> GetAllTales(){} 

    [HttpGet] 
    public Tale GetTale(int id){} 

Спасибо за все ответы.

+0

Поместите свой собственный маршрут до того, как по умолчанию будет выбран по умолчанию, или по умолчанию будут запрашиваться ваши запросы. –

+0

На самом деле я не понимаю. Если я поставлю costum route/api/tales/kids, вы получите сообщение об ошибке. Потому что это отправляет запрос GetTale (int id). – BerdaN

ответ

1

Вам необходимо переключить маршрут. Маршрут по умолчанию будет обрабатывать запрос, если вы не укажете идентификатор (api/tales), поэтому вам нужно разместить свой собственный маршрут до этого.

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

config.Routes.MapHttpRoute(
     name: "DefaultApi", 
     routeTemplate: "api/{controller}/{id}", 
     defaults: new { id = RouteParameter.Optional }, 
     constraints: new { id = @"^[0-9]+$" } 
    ); 
+0

Я понял. Как я могу переключать маршруты? Как я сказал, я не использовал ограничение для маршрута по умолчанию. Но если я могу это сделать (удалить ограничение)/api/tales/kids, отправьте запрос GetTale (int id). Я не знаю, как это исправить. – BerdaN

+0

@BerdaN Измените свой порядок в коде, как в моем ответе. –

+0

На самом деле у меня нет пользовательского маршрута. У меня есть два маршрута, и он находится здесь:/ – BerdaN