роутинг web api - ошибка по сопоставления маршрутов

179
16 октября 2018, 06:10

Продолжаю эпопею с роутингом

Методы контроллера:

        public Object Get(int id)
        {
            PrivateConsultant cons = consMng.GetById(id);
            PrivateConsultantVM result = new PrivateConsultantVM
            {
                Name = cons.Name,
                Surname = cons.Surname,
                Patronymic = cons.Patronymic,
                Rating = cons.Rating,
                ServicesTitles = serviceMng.GetTitles(cons.Id)
            };
            return Ok(new { result, date = DateTime.Now });
        }
        [HttpGet]
        public Object GgetByEntityId(int id)
        {
            return Ok(new { result = "GetByEntityId" });
        }

(2 g ввёл специально)

Настройка роутинга:

    config.Routes.MapHttpRoute(
        name: "ActionRoute",
        routeTemplate: "api/{controller}/{action}/{id}",
        defaults: new { },
        constraints: new
        {
                action = new AlphaRouteConstraint(),
        }
    );

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

Срабатывает только этот метод метод:

http://localhost:54788/api/consultants/GgetByEntityId/1

Если так

http://localhost:54788/api/consultants/1

то ошибка

<Error>
<Message>Произошла ошибка.</Message>
<ExceptionMessage>
Найдено несколько действий, соответствующих запросу: Get на типе WebApplication1.Controllers.ConsultantsController GgetByEntityId на типе WebApplication1.Controllers.ConsultantsController
</ExceptionMessage>
<ExceptionType>System.InvalidOperationException</ExceptionType>
<StackTrace>
в System.Web.Http.Controllers.ApiControllerActionSelector.ActionSelectorCacheItem.SelectAction(HttpControllerContext controllerContext) в System.Web.Http.Controllers.ApiControllerActionSelector.SelectAction(HttpControllerContext controllerContext) в System.Web.Http.ApiController.ExecuteAsync(HttpControllerContext controllerContext, CancellationToken cancellationToken) в System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext()
</StackTrace>
</Error>

Не понимаю почему, должно работать Когда идёт 2-й запрос, роутинг сопоставляет его с роутом ActionRoute. Единица в запросе сопоставляется с {action}, но т.к. у action ограничение на строку, то дальше запрос сопоставляется с роутом DefaultApi

Где ошибка?

READ ALSO
WPF. Закрытие окна при потере фокуса

WPF. Закрытие окна при потере фокуса

В WPF приложении есть небольшая информационная форма, которая вызывается с основнойПо задумке на этой информационной форме должен быть стандартный...

158
C# прокси, поддерживающий авторизацию по сертификату

C# прокси, поддерживающий авторизацию по сертификату

У меня имеется rest self host клиент на одной машине и сервер на другойАвторизация используется по сертификату (httpClientHandler

175
Отловить нажатие на стрелки в TextBox

Отловить нажатие на стрелки в TextBox

Каким образом можно отловить нажатие на стрелки при вводе текста в TextBox? Событие KeyDown не реагирует на их нажатие

189
Uncaught Error: Popover requires tooltip.js

Uncaught Error: Popover requires tooltip.js

Сайт не открывает всплывающие окна, в консоли такая ошибка, как мне подключить tooltip к popover?

175