1

Я работаю над проектом веб-ави.Устранение неполадок при запуске метода веб-api

У меня есть два метода получения действий в контроллере.

Здесь контроллер:

namespace Playground.Web.Controllers.API 
{ 
    [RoutePrefix("api/DamageEvent/{actionType}")] 
    public class DamageEventController : ApiController 
    { 
     #region API methods 
     [HttpGet] 
     public async Task<IHttpActionResult> GetDamageEvent(int damageEventId = 0) 
     { 
      //some logic 
     } 
     [HttpGet] 
     [Route("{ddd:int}")] 
     public async Task<IHttpActionResult> GetDamageEvent2(int ddd = 0) 
     { 
      //some logic 
     } 
     #endregion 
    } 
} 

Здесь WebApiConfig Defenition:

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     // Web API configuration and services 

     // Web API routes 
     config.MapHttpAttributeRoutes(); 

     config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 
     config.Formatters.JsonFormatter.SerializerSettings.DateFormatString = "dd/MM/yyyy"; 
    } 
} 

Вот пример URL в скрипача композе для запуска веб-апи действия:

http://localhost/playground/api/DamageEvent/GetDamageEvent2/?ddd=22 

я ожидаю, что для URL-адреса выше GetDamageEvent2 Действие api будет запущено. Но вместо этого срабатывает метод GetDamageEvent.

Почему GetDamageEvent2 не уволен? Любая идея, что мне не хватает?

=================== Обновление ================= ===================

После того как я красный ответ от Нкоси

Я сделал некоторые изменения в свой код, я добавил в класс WebApiConfig новый маршрут :

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

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

А вот изменения типа действия:

namespace Playground.Web.Controllers.API 
{ 
    [RoutePrefix("api/DamageEvent")] 
    public class DamageEventController : ApiController 
    { 
     #region API methods 
     [HttpGet] 
     [Route("GetDamageEvent/{damageEventId}")] 
     public async Task<IHttpActionResult> GetDamageEvent(int damageEventId = 0) 
     { 
      //some logic 
     } 
     [HttpGet] 
     [Route("GetDamageEvent2/{ddd}")] 
     public async Task<IHttpActionResult> GetDamageEvent2(int ddd = 0) 
     { 
      //some logic 
     } 
     #endregion 
    } 
} 

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

Но проблема теперь, когда я пытаюсь вызвать другие действия в других контроллерах, например:

http://localhost/playground/api/Contracts/1 

Я получаю сообщение об ошибке 404.

Так что, я думаю, ошибка возникает из-за нового шаблона маршрута.

Итак, мой вопрос: как я могу исправить ошибку выше и принять новый шаблон маршрута во внимание только тогда, когда URI попытается получить доступ к DamageEventController?

+0

Вам нужно будет показать контроллер, который не работает, мы сделаем предположения относительно того, почему он не работает. – Nkosi

+0

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

+0

@Nkosi, я переключил шаблоны заказов на маршрут. Когда я пытаюсь получить доступ к контроллеру DamageEvent, я получаю ошибку 405. – Michael

ответ

1

Вы смешиваете маршрутизацию атрибутов и маршрутизацию на основе условных обозначений.

Ничто не соответствует вашему RoutePrefix, потому что нет никаких действий в контроллере, который имеет как {actionType}и{ddd} шаблонов.

Но ваш заявленная URL ...

api/DamageEvent/GetDamageEvent2/?ddd=22 

... совпадает с маршрутом на основе DefaultApi конвенции для GetDamageEvent в таблице маршрутов, поскольку он не имеет [RouteAttribute] и он по умолчанию обратно конвенции, где ...

api/{controller=DamageEvent}/{id=GetDamageEvent2/?ddd=22} 

Взгляните на Routing in ASP.NET Web API понять маршрутизацию на основе конвенции.

, а также Attribute Routing in ASP.NET Web API 2

Каждая запись в таблице маршрутизации содержит шаблон маршрута. Шаблон маршрута по умолчанию для для веб-API является «api/{controller}/{id}». В этом шаблоне «api» является литеральным сегментом пути, а {controller} и {id} являются переменными-заполнителями.

Когда веб-интерфейс API получает HTTP-запрос, он пытается сопоставить URI с одним из шаблонов маршрутов в таблице маршрутизации. Если маршрут не совпадает, клиент получает ошибку 404. Например, следующие идентификаторы URI соответствует маршруту по умолчанию:

/api/DamageEvent 
/api/DamageEvent/1 
/api/DamageEvent/GetDamageEvent2/?ddd=22 

После согласования маршрута найден, Web API выбирает контроллер и действия:

  • Чтобы найти контроллер , Web API добавляет «Controller» к значению переменной {controller}.
  • Чтобы найти действие, веб-API просматривает метод HTTP, а затем ищет действие, имя которого начинается с имени этого метода HTTP. Для примера с запросом GET веб-API ищет действие, которое начинается с с помощью «Get ...», например «GetDamageEvent». Это соглашение применяется только к методам GET, POST, PUT и DELETE. Вы можете использовать другие методы HTTP, используя атрибуты на вашем контроллере. Мы увидим пример этого позже.
  • Другие переменные-заполнители в шаблоне маршрута, такие как {id}, сопоставляются с параметрами действия.

Чтобы получить заявленный маршрут на работу, вам необходимо обновить шаблоны маршрутов. Либо маршрут атрибута, либо добавьте новый маршрут конвенции в таблицу маршрутов

+0

Спасибо за ответ. Это помогло мне понять некоторые моменты. Но, к сожалению, при добавлении нового шаблона маршрута другие запросы URI к другим действиям в других контроллерах создают проблемы. Я обновил свой вопрос. пожалуйста, проверьте мое обновление. – Michael

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