У меня проблема с кодировкой, с которой я не могу разобраться в отношении параметра на маршруте. По сути, он либо никогда URL не кодирует, либо double URL кодирует. Я просто хочу, чтобы это было в одном кодировке!
Вот маршрут, который я зарегистрировал:
routes.MapRoute("Scan", "Scan/{*url}", new { controller = "Scan", action = "Index" });
Теперь у меня есть действие контроллера, которое перенаправляет на этот маршрут. Для простоты, скажем, это выглядит так:
var url = "troyhunt.com/search";
return RedirectToRoute("Scan", new { url });
Полученный URL-адрес - «Scan / troyhunt.com / search» - обратите внимание, что косая черта после .com не была , не экранирована.
Теперь давайте попробуем это снова, но применим кодировку URL:
var url = HttpUtility.UrlEncode("troyhunt.com/search");
return RedirectToRoute("Scan", new { url });
На этот раз результирующий URL-адрес будет «Scan / troyhunt.com% 252fsearch» - обратите внимание, что косая черта была закодирована двойным образом. Если я установлю точку останова до перенаправления, я увижу метод UrlEncode, успешно кодирующий косую черту в% 2f.
Похоже, что редирект кодирует символ "%", но не "/". Если я тестирую с другими символами, обычно экранированными с помощью URL-кодировки (?, =), Кодировка работает просто отлично прямо из метода RedirectToRoute. Может ли это быть проблемой, если рассматривать косую черту как разделительный сегмент маршрута, а значит, не избежать его? Я что-то здесь упускаю?
Обновление: дополнительные сведения, комментарии и обходные пути обсуждаются в Направлять или не направлять, это вопрос .