Маршрутизация WebAPI сокращает подстановочный параметр на вопросительный знак

У меня есть маршрут в контроллере, который должен соответствовать всем в части URL и поместить его в строковый параметр.

Что у меня есть:

    [Route("api/proxy/{proxyId}/{*parameter}")]
    public Task<HttpResponseMessage> Mediate(int proxyId, string parameter)

и для неизвестного URL, например:

HTTP: // локальный / API / прокси / 1 / тест а = 1 & Ь = 2

Я хотел бы, чтобы переменная "parameter" содержала:

тест? а = 1 & Ь = 2

Вместо этого он содержит:

тестовое задание

Как я могу указать маршрут, чтобы не вырезать все после вопросительного знака? Для этого конкретного случая я могу извлечь его из объекта Request.RequestUri, но это было бы.. не элегантно.

1 ответ

Решение

Тебе этого не сделать. По определению сегменты URL не включают строку запроса.

Тем не менее, вы можете сделать что-то действительно легко: внутри вашего контроллера WebApi у вас есть Request свойство, которое содержит строку запроса:

Request.RequestUri.Query

Вы просто должны объединить параметр URL с этим, чтобы иметь то, что вам нужно. Это включает в себя ведущий знак вопроса:

Свойство Query содержит любую информацию запроса, включенную в URI. Информация о запросе отделяется от информации о пути знаком вопроса (?) И продолжается до конца URI. Возвращенная информация о запросе включает ведущий знак вопроса.

от Uri.Query Property

Если вы по-прежнему хотите, чтобы он работал по-другому, вам нужно будет включить свой собственный поставщик маршрутов, внедрить собственный IDirectRouteProvider и зарегистрировать его. Смотрите это: получите список шаблонов атрибутов маршрута asp.net webapi 2.2

Но делать что-то подобное неестественно. Почему все происходит по-другому, как стандартный способ, который все остальные люди понимают и используют?

Другие вопросы по тегам