Asp.Net Маршрутизация MVC - как мне сопоставить весь URL-адрес целиком?
-
06-07-2019 - |
Вопрос
Я пытаюсь создать универсальный маршрут для отслеживания наличия партнерской строки в URL-адресе.Идентификационный код помечается знаком x
за которым следует int
, и будет отображаться только в конце URL-адреса (но перед строкой запроса).
Идея заключается в том, что я извлеку идентификатор партнера, проведу некоторое протоколирование, затем выполню 301 ответ на тот же запрос без идентификатора партнера.
Например:
http://www.domain.com/x32
http://www.domain.com/x32/
http://www.domain.com/path/to/something/x32
http://www.domain.com/x32?query=string
http://www.domain.com/x32/?query=string
http://www.domain.com/path/to/something/x32?query=string
http://www.domain.com/path/to/something/x32/?query=string
У меня есть этот маршрут
routes.Add(new Route("{url}/x{affiliateExternalId}", new MvcRouteHandler())
{
Defaults = new RouteValueDictionary(
new { controller = "Home", action = "LogCookieAndRedirect" }
),
Constraints = new RouteValueDictionary(new { affiliateExternalId = @"\d{1,6}" })
});
Который соответствует только
http://www.domain.com/path/x32
http://www.domain.com/path/x32/
Что мне нужно сделать, чтобы сопоставить все и передать строку запроса контроллеру?Существует *
оператор, который, как я подозреваю, мне следует использовать, но я не могу заставить его делать то, что мне нужно.
Решение
{* url}
будет соответствовать всему пути, а не одному сегменту. Однако, поскольку он соответствует всему пути, вы не можете сопоставить идентификатор партнера в конце. Маршрут будет соответствовать каждому запросу. Вы можете обойти это, добавив ограничение маршрута, чтобы проверить, что url
имеет идентификатор партнера в конце:
routes.MapRoute(
"WithAffiliate",
"{*url}",
new { controller="Home", action="LogCookieAndRedirect" },
new { url = @"/x[0-9]+routes.MapRoute(
"WithAffiliate",
"x{affiliateExternalId}/{*url}",
new { controller="Home", action="LogCookieAndRedirect" }
);
quot; }
);
В этом случае вашему действию потребуется проанализировать идентификатор партнера по самому параметру url
. Если у вас есть возможность изменить структуру URL-адреса, можно будет сопоставить идентификатор, если бы он был в начале пути:
Другие советы
Если бы я делал это, я бы сделал это одним из значений в строке запроса.
Пример:
http//www.domain.com/path/to/something?affiliate=X32&query=string
Проблема в том, что идентификатор партнера необязательно.Если вы добавите его в path, вы измените структуру path в зависимости от того, присутствует ли идентификатор партнера или нет, поэтому вам придется выполнять каждый из ваших маршрутов дважды (один раз с идентификатором партнера и один раз без).
Вы можете использовать этот универсальный маршрут только в том случае, если у вас определен только один маршрут.Но если у вас есть несколько маршрутов, то вам придется добавить это {affiliateExternalId}
параметр для всех маршрутов (если только я чего-то не упустил).
Я второй Роберт Харви's предложение.