Как вы используете UrlEncode без использования System.Web?

Я пытаюсь написать клиентское приложение Windows, которое вызывает веб-сайт для данных. Чтобы свести установку к минимуму, я пытаюсь использовать dll в профиле клиента .NET Framework. Проблема в том, что мне нужно UrlEncode некоторые параметры, есть ли простой способ сделать это без импорта System.Web.dll, который не является частью клиентского ПО?

Ответ 1

System.Uri.EscapeUriString() может быть проблематичным с определенными символами, для меня это был номер/фунт "#" в строке.

Если это проблема для вас, попробуйте:

System.Uri.EscapeDataString() //Works excellent with individual values

Вот ответ на вопрос SO, объясняющий разницу:

В чем разница между EscapeUriString и EscapeDataString?

и рекомендует использовать Uri.EscapeDataString() в любом аспекте.

Ответ 2

В .Net 4.5+ используйте WebUtility

Только для форматирования я представляю это как ответ.

Не удалось найти хороших примеров, сравнивающих их так:

string testString = "http://test# space 123/text?var=val&another=two";
Console.WriteLine("UrlEncode:         " + System.Web.HttpUtility.UrlEncode(testString));
Console.WriteLine("EscapeUriString:   " + Uri.EscapeUriString(testString));
Console.WriteLine("EscapeDataString:  " + Uri.EscapeDataString(testString));
Console.WriteLine("EscapeDataReplace: " + Uri.EscapeDataString(testString).Replace("%20", "+"));

Console.WriteLine("HtmlEncode:        " + System.Web.HttpUtility.HtmlEncode(testString));
Console.WriteLine("UrlPathEncode:     " + System.Web.HttpUtility.UrlPathEncode(testString));

//.Net 4.0+
Console.WriteLine("WebUtility.HtmlEncode: " + WebUtility.HtmlEncode(testString));
//.Net 4.5+
Console.WriteLine("WebUtility.UrlEncode:  " + WebUtility.UrlEncode(testString));

Выходы:

UrlEncode:         http%3a%2f%2ftest%23+space+123%2ftext%3fvar%3dval%26another%3dtwo
EscapeUriString:   http://test#%20space%20123/text?var=val&another=two
EscapeDataString:  http%3A%2F%2Ftest%23%20space%20123%2Ftext%3Fvar%3Dval%26another%3Dtwo
EscapeDataReplace: http%3A%2F%2Ftest%23+space+123%2Ftext%3Fvar%3Dval%26another%3Dtwo

HtmlEncode:        http://test# space 123/text?var=val&another=two
UrlPathEncode:     http://test#%20space%20123/text?var=val&another=two

//.Net 4.0+
WebUtility.HtmlEncode: http://test# space 123/text?var=val&another=two
//.Net 4.5+
WebUtility.UrlEncode:  http%3A%2F%2Ftest%23+space+123%2Ftext%3Fvar%3Dval%26another%3Dtwo

В .Net 4.5+ используйте WebUtility .UrlEncode

Кажется, что репликация HttpUtility.UrlEncode (pre-v4.0) для более общих символов:
Uri.EscapeDataString(testString).Replace("%20", "+").Replace("'", "%27").Replace("~", "%7E")
Примечание: EscapeUriString будет содержать действительную строку uri, которая заставит ее использовать как можно больше символов открытого текста.

См. этот ответ для таблицы Сравнение различных кодировок:
fooobar.com/questions/8420/...

Разрывы строк Все перечисленные здесь (кроме HttpUtility.HtmlEncode) конвертируют "\n\r" в %0a%0d или %0a%0d

Не стесняйтесь редактировать это и добавлять новые символы в свою тестовую строку или оставлять их в комментариях, и я отредактирую их.

Ответ 4

Ответы здесь очень хорошие, но для меня все еще недостаточно.

Я написал небольшой цикл, который сравнивает Uri.EscapeUriString с Uri.EscapeDataString для всех символов от 0 до 255.

ПРИМЕЧАНИЕ. Обе функции имеют встроенный интеллект, что символы выше 0x80 кодируются сначала кодировкой UTF-8 и затем кодируются процентом.

Вот результат:

******* Different *******

'#' -> Uri "#" Data "%23"
'$' -> Uri "$" Data "%24"
'&' -> Uri "&" Data "%26"
'+' -> Uri "+" Data "%2B"
',' -> Uri "," Data "%2C"
'/' -> Uri "/" Data "%2F"
':' -> Uri ":" Data "%3A"
';' -> Uri ";" Data "%3B"
'=' -> Uri "=" Data "%3D"
'?' -> Uri "?" Data "%3F"
'@' -> Uri "@" Data "%40"


******* Not escaped *******

'!' -> Uri "!" Data "!"
''' -> Uri "'" Data "'"
'(' -> Uri "(" Data "("
')' -> Uri ")" Data ")"
'*' -> Uri "*" Data "*"
'-' -> Uri "-" Data "-"
'.' -> Uri "." Data "."
'_' -> Uri "_" Data "_"
'~' -> Uri "~" Data "~"

'0' -> Uri "0" Data "0"
.....
'9' -> Uri "9" Data "9"

'A' -> Uri "A" Data "A"
......
'Z' -> Uri "Z" Data "Z"

'a' -> Uri "a" Data "a"
.....
'z' -> Uri "z" Data "z"

******* UTF 8 *******

.....
'Ò' -> Uri "%C3%92" Data "%C3%92"
'Ó' -> Uri "%C3%93" Data "%C3%93"
'Ô' -> Uri "%C3%94" Data "%C3%94"
'Õ' -> Uri "%C3%95" Data "%C3%95"
'Ö' -> Uri "%C3%96" Data "%C3%96"
.....

EscapeUriString должен использоваться для кодирования URL-адресов, тогда как EscapeDataString должен использоваться для кодирования, например, содержимого Cookie, поскольку данные Cookie не должны содержать зарезервированные символы '=' и ';'.

Ответ 5

Здесь доступна клиентская версия, класс System.Net.WebUtility, присутствующая в профиле клиента System.dll. Здесь ссылка MSDN:

WebUtility

Ответ 6

Здесь приведен пример отправки запроса POST, который правильно кодирует параметры с использованием типа содержимого application/x-www-form-urlencoded:

using (var client = new WebClient())
{
    var values = new NameValueCollection
    {
        { "param1", "value1" },
        { "param2", "value2" },
    };
    var result = client.UploadValues("http://foo.com", values);
}

Ответ 8

System.Net.WebUtility.HtmlDecode