Конфликты с маршрутизацией при использовании маршрута по умолчанию {controller} / {id} и маршрута {controller} / {action} / {id} - PullRequest
0 голосов
/ 02 апреля 2020

У меня есть следующие настройки маршрутов:

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

RouteTable.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = System.Web.Http.RouteParameter.Optional },
    constraints: null,
    handler: new WebApiMessageHandler(GlobalConfiguration.Configuration));

и следующие настройки контроллера;

public class GetFileController : ApiController
{
    [HttpGet]
    public HttpResponseMessage Get(string id)
    {
        return Request.CreateResponse(HttpStatusCode.OK);
    }
}

У меня проблема в том, что этот URL

/api/GetFile/id_is_a_string

возвращает эту ошибку;

<Error>
    <Message>
        No HTTP resource was found that matches the request URI /api/GetFile/id_is_a_string.
    </Message>
    <MessageDetail>
        No action was found on the controller 'GetFile' that matches the name 'id_is_a_string'.
    </MessageDetail>
</Error>

Можно ли как-то обойтись, если не считать, что строковый параметр на самом деле является именем действия?

Я знаю, что мог бы изменить URL своего запроса на be;

/api/GetFile?id=id_is_a_string

но это изменение маршрутизации затрагивает многие другие контроллеры, которые я уже установил, и на самом деле не через sh до go через все, чтобы переключить его для отправки запроса таким способом .

Если я переупорядочиваю маршруты, кажется, что это работает, как и раньше, но для моего нового контроллера, который в идеале мне бы хотелось иметь в пределах нескольких конечных точек, я получаю эту ошибку;

ExceptionMessage=Multiple actions were found that match the request:

Новый контроллер

public class GettingThingsController : ApiController
    {

        [HttpPost]
        public IHttpActionResult GetPeople()
        {
             return Ok();
        }

        [HttpPost]
        public IHttpActionResult GetProducts()
        {
            return Ok();
        }
    }

Есть ли какой-либо способ достижения того, что мне нужно?!

1 Ответ

0 голосов
/ 02 апреля 2020

Вы можете попытаться указать параметры с помощью регулярного выражения:

routeTemplate: "api/{controller}/{action:regex([a-z]{1}[a-z0-9_]+)}/{id:regex([0-9]+)}",

routeTemplate: "api/{controller}/{id:regex([0-9]+)}",

Эти регулярные выражения работают в атрибуте Route. Вы можете проверить это в RouteTable отображениях.

...