2012-04-25 2 views
2

Фон: Я пытаюсь использовать некоторые 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*() 

Вопрос: Может кто-нибудь объяснить, что происходит?

ответ

1

Похоже, что используется «безопасное» декодирование. В вашем втором примере он не будет декодировать # или%, потому что это изменит структуру/значение URI.

Если вы не хотите, чтобы это декодирование произошло, прекратите вызывать .ToString() в URI и вместо этого получите доступ к компонентам, которые вы хотите напрямую.

+0

Спасибо за ответ. Интересно, почему это расшифровка &, поскольку это также изменяет значение URI. Моя цель состояла в том, чтобы иметь возможность использовать существующий URI, что-то изменить, и вернуть весь URI. Легко было обойтись без классов .NET, но я хотел понять, что происходит. –

1

Поскольку URI делает использование URL-адрес закодировать

вы можете использовать это, чтобы читать оригинал или добавить закодированное значение для объекта URI:

 System.Web.HttpUtility.UrlDecode("NY%26A"); 
     System.Web.HttpUtility.UrlEncode("NY&A");