Фон: Я пытаюсь использовать некоторые URL-адреса для приложения MVC. Я написал метод расширения HtmlHelper, который заменяет значение строки запроса другим. Метод принимает текущую строку запроса, вручную разбивает часть запроса (чтобы предотвратить Foo = 1 & Foo = Hello% 2c% 20World! & Foo = 2 от чтения как Foo = 1, Hello, World, 2) и затем пытается использовать UriBuilder и Uri для получения URL-адреса.Почему Uri частично декодирует часть запроса?
Задача: По некоторым причинам Uri.ToString частично декодирует строки запроса. В качестве быстрого теста, я разжег LINQPad и побежал следующее:
var ub = new System.UriBuilder("http://foobar");
ub.Query = "NY%26A"; // NY&A
ub.Uri.Dump();
ub.Uri.ToString().Dump();
ub.Uri.Query.Dump();
ub.ToString().Dump();
Результаты:
http://foobar/?NY&A
http://foobar/?NY&A
?NY%26A
http://foobar:80/?NY%26A
Я говорю частично декодирования, потому что, если я использую много уцелевших символов, он декодирует некоторые и оставляет других в месте:
var ub = new System.UriBuilder("http://foobar");
ub.Query = "!%40%23%24%25%5E%26*()"; // [email protected]#$%^&*()
ub.Uri.Dump();
ub.Uri.ToString().Dump();
ub.Uri.Query.Dump();
ub.ToString().Dump();
И результаты:
http://foobar/[email protected]%23$%25^&*()
http://foobar/[email protected]%23$%25^&*()
?!%40%23%24%25%5E%26*()
http://foobar:80/?!%40%23%24%25%5E%26*()
Вопрос: Может кто-нибудь объяснить, что происходит?
Спасибо за ответ. Интересно, почему это расшифровка &, поскольку это также изменяет значение URI. Моя цель состояла в том, чтобы иметь возможность использовать существующий URI, что-то изменить, и вернуть весь URI. Легко было обойтись без классов .NET, но я хотел понять, что происходит. –