Сервер.UrlEncode против HttpUtility.Функция urlencode
есть ли разница между сервером.UrlEncode и HttpUtility.Функция urlencode?
6 ответов:
HttpServerUtility.UrlEncode
использоватьHttpUtility.UrlEncode
внутренне. Особой разницы нет. Причина существованияServer.UrlEncode
совместимость с классическим ASP.
у меня были значительные головные боли с этими методами раньше,Я рекомендую вам избежать любой вариант
UrlEncode
, а вместо этого используйтеUri.EscapeDataString
- по крайней мере, у этого есть понятное поведение.давайте посмотрим...
HttpUtility.UrlEncode(" ") == "+" //breaks ASP.NET when used in paths, non- //standard, undocumented. Uri.EscapeUriString("a?b=e") == "a?b=e" // makes sense, but rarely what you // want, since you still need to // escape special characters yourself
но мой личный фаворит должен быть HttpUtility.UrlPathEncode - эта штука действительно непонятна. Он кодирует:
- " " ==> "%20"
- "100% true "= = > " 100%%20true "(ок, ваш url теперь сломан)
- "test A. aspx#anchor B" = = > " test%20A. aspx#якорь%20B"
- " тест A. aspx?хм#якорь B "= = > " тест%20A. aspx?хм#якорь B" (обратите внимание на разницу с предыдущей последовательности!)
у него также есть прекрасная специфическая документация MSDN " кодирует часть пути строки URL для надежной передачи HTTP с веб-сервера на a клиент."- фактически не объясняя, что он делает. Вы с меньшей вероятностью выстрелите себе в ногу из Узи...
короче, палкой Uri.Сбежал из тюрьмы.
имейте в виду, что вы, вероятно, не должны использовать ни один из этих методов. Microsoft Библиотека Сценариев Анти-Кросс Сайта включает в себя замену
HttpUtility.UrlEncode
иHttpUtility.HtmlEncode
которые являются более совместимыми со стандартами и более безопасными. В качестве бонуса вы получаетеJavaScriptEncode
способ также.
быстрая перемотка вперед почти 9 лет с тех пор, как это было впервые задано, и в мире .NET Core и .NET Standard, похоже, наиболее распространенными вариантами, которые мы имеем для кодирования URL, являются WebUtility.UrlEncode (при
System.Net
) и Uri.Сбежал из тюрьмы. Судя по самому популярному ответу здесь и в других местах, Uri.Сбежал из тюрьмы представляется предпочтительным. Но так ли это? Я сделал некоторый анализ, чтобы понять разницу и вот что я придумал с:
WebUtility.UrlEncode
кодирует пространство как+
;Uri.EscapeDataString
кодирует его как%20
.Uri.EscapeDataString
процентов-кодирует!
,(
,)
и*
;WebUtility.UrlEncode
нет.WebUtility.UrlEncode
процентов-кодирует~
;Uri.EscapeDataString
нет.Uri.EscapeDataString
бросает aUriFormatException
на строках длиной более 65 520 символов;WebUtility.UrlEncode
нет. (более распространенная проблема, чем вы могли бы подумать, особенно при работе с URL-кодированной формой данные.)Uri.EscapeDataString
бросает aUriFormatException
на высокая суррогатные символы;WebUtility.UrlEncode
нет. (Это вещь UTF-16, вероятно, намного менее распространенная.)для целей кодирования URL-адресов символы вписываются в одну из 3 категорий: unreserved (legal in a URL); reserved (legal in но имеет особое значение, поэтому вы может хотите закодировать его); и все остальное (всегда должно быть закодировано).
по RFC, зарезервированных символов:
:/?#[]@!$&'()*+,;=
и незащищенные символы буквенно-цифровые и
-._~
Приговор
Uri.Сбежал из тюрьмы четко определяет свою миссию: % - кодирует все зарезервированные и незаконные символы. WebUtility.UrlEncode является более неоднозначным как в определении, так и в реализации. Как ни странно, он кодирует некоторые зарезервированные символы, но не другие (почему скобки, а не скобки??), и что еще более странно, он кодирует это невинно незащищенное
~
символ.поэтому я согласен с Народным советом-используйте Uri.Сбежал из тюрьмы когда это возможно, и понять, что зарезервированные символы, такие как
/
и?
будет закодирован. Если вам нужно иметь дело с потенциально большими строками, особенно с содержимым формы в кодировке URL, вам нужно либо вернуться к WebUtility.UrlEncode и принять его причуды, или иначе работать вокруг проблемы.
EDIT: я попытка чтобы исправить все причуды, упомянутые выше в Flurl через
Url.Encode
,Url.EncodeIllegalCharacters
иUrl.Decode
статические методы. Они находятся в базовый пакет (который крошечный и не включает в себя все HTTP-материалы), или не стесняйтесь копировать их из источника. Я приветствую любые комментарии / отзывы у вас есть на них.
вот код, который я использовал для знакомства какие символы кодируются по-разному:
var diffs = from i in Enumerable.Range(0, char.MaxValue + 1) let c = (char)i where !char.IsHighSurrogate(c) let diff = new { Original = c, UrlEncode = WebUtility.UrlEncode(c.ToString()), EscapeDataString = Uri.EscapeDataString(c.ToString()), } where diff.UrlEncode != diff.EscapeDataString select diff; foreach (var diff in diffs) Console.WriteLine($"{diff.Original}\t{diff.UrlEncode}\t{diff.EscapeDataString}");