Я пытаюсь написать клиентское приложение Windows, которое вызывает веб-сайт для данных. Чтобы свести установку к минимуму, я пытаюсь использовать только dll в .NET Framework Client Profile . Проблема в том, что мне нужно UrlEncode некоторых параметров, есть ли простой способ сделать это без импорта System.Web.dll, который не является частью Client Pofile?
c#
.net
urlencode
.net-client-profile
Мартин Браун
источник
источник
WebRequest
илиWebClient
. Вот почему я спросил об этом конкретном коде, потому что есть вещи, которые можно сделать с правильными данными кодирования URL.Ответы:
System.Uri.EscapeUriString()
может быть проблематично с определенными символами, для меня это был знак числа / фунта '#' в строке.Если это проблема для вас, попробуйте:
Вот так ответ на вопрос, который объясняет разницу:
В чем разница между EscapeUriString и EscapeDataString?
и рекомендует использовать
Uri.EscapeDataString()
в любом аспекте.источник
Uri.EscapeUriString
действительно очень проблематично и не должно использоваться, поскольку он пытается что-то сделать (избегая полных URI), что на самом деле невозможно сделать последовательно. См. этот ответ для подробного объяснения.В .Net 4.5+ используют
WebUtility
Просто для форматирования я отправляю это как ответ.
Не могу найти хороших примеров, сравнивающих их так:
Выходы:
В .Net 4.5+ используют
WebUtility
.UrlEncode
Это похоже на репликацию
HttpUtility.UrlEncode
(до v4.0) для более распространенных символов:Uri.EscapeDataString(testString).Replace("%20", "+").Replace("'", "%27").Replace("~", "%7E")
Примечание:
EscapeUriString
сохранит допустимую строку URI, что заставит его использовать как можно больше символов открытого текста.См. Этот ответ для таблицы, сравнивающей различные кодировки:
https://stackoverflow.com/a/11236038/555798
Разрывы строк Все перечисленные здесь (кроме
HttpUtility.HtmlEncode
) будут преобразованы"\n\r"
в%0a%0d
или%0A%0D
Пожалуйста, не стесняйтесь редактировать это и добавлять новые символы в мою тестовую строку, или оставить их в комментариях, и я отредактирую это.
источник
EscapeDataString
не то,EscapeUriString
что мы кодировали возвраты каретки и переводы строк, и это требовало более агрессивного побегаEscapeDataString
Ты можешь использовать
Uri.EscapeUriString (см http://msdn.microsoft.com/en-us/library/system.uri.escapeuristring.aspx )
источник
Uri.EscapeUriString
. Он не «понимает», какие части должны быть закодированы, это просто ошибочная попытка что-то сделать (избегая полных URI), что на самом деле невозможно сделать последовательно. Смотрите этот ответ для подробного объяснения.Ответы здесь очень хорошие, но все же недостаточны для меня.
Я написал небольшой цикл, который сравнивает
Uri.EscapeUriString
сUri.EscapeDataString
для всех символов от 0 до 255.ПРИМЕЧАНИЕ. Обе функции имеют встроенный интеллект: символы выше 0x80 сначала кодируются в кодировке UTF-8, а затем кодируются в процентах.
Вот результат:
EscapeUriString
должен использоваться для кодирования URL, в то времяEscapeDataString
как должен использоваться, например, для кодирования содержимого Cookie, поскольку данные Cookie не должны содержать зарезервированные символы'='
и';'
.источник
Uri.EscapeUriString
, поскольку экранирование полных URI невозможно сделать последовательно. Смотрите этот ответ для подробного объяснения.В клиентском профиле System.dll имеется версия для использования в профиле клиента, класс System.Net.WebUtility. Вот ссылка MSDN:
WebUtility
источник
Вот пример отправки запроса POST, который правильно кодирует параметры, используя
application/x-www-form-urlencoded
тип содержимого:источник
Чтобы UrlEncode без использования System.Web:
более подробная информация: https://www.samnoble.co.uk/2014/05/21/beware-webutility-urlencode-vs-httputility-urlencode/
источник
источник