Я пытаюсь написать клиентское приложение Windows, которое вызывает веб-сайт для данных. Чтобы сохранить установку до минимума, я пытаюсь использовать только dlls in the .NET Framework Client Profile. Проблема в том, что мне нужно UrlEncode некоторые параметры, есть ли простой способ сделать это без импорта System.Web.dll, который не является частью клиентского ПО?Как вы используете UrlEncode без использования System.Web?
ответ
System.Uri.EscapeUriString()
может быть проблематичным с определенными символами, для меня это был номер/фунт «#» в строке.
Если это для вас проблемой, попробуйте:
System.Uri.EscapeDataString() //Works excellent with individual values
Вот так вопрос ответ, который объясняет разницу:
What's the difference between EscapeUriString and EscapeDataString?
и рекомендует использовать Uri.EscapeDataString()
в любой аспект.
False: http://blogs.msdn.com/b/yangxind/archive/2006/11/09/don-t-use-net-system-uri-unescapedatastring-in-url-decoding.aspx У вас будет проблемы с плюсовыми знаками, поскольку они не будут незакодированы. –
Это сообщение в блоге немного устарело, и у меня просто «Uri Escaped» полный url, и все пробелы стали% 20, поэтому я думаю, что они исправили это. Я использую .Net 4.5. – Rodi
EscapeDataString также не поддерживает очень длинные строки, если вы готовите данные для операции POST. http://stackoverflow.com/questions/6695208/uri-escapedatastring-invalid-uri-the-uri-string-is-too-long –
В клиентском профиле System.dll присутствует гостевая версия, класс System.Net.WebUtility. Вот MSDN Ссылка:
К сожалению, там нет метода 'UrlEncode'. –
ahh well, fail for me = (Вы просматриваете когда-либо один вопрос о переполнении стека? – Sprague
только те, что меня интересуют. –
Вы можете использовать
Uri.EscapeUriString (см http://msdn.microsoft.com/en-us/library/system.uri.escapeuristring.aspx)
Есть ли разница между этим и EscapeDataString? –
Вы хотите использовать EscapeUriString.EscapeUriString будет пытаться кодировать весь URL-адрес (включая http: // part), в то время как EscapeUriString понимает, какие части должны быть закодированы. –
Я вижу, поэтому в этом случае мне, вероятно, понадобится EscapeDataString, поскольку я могу передать URL-адрес как get параметр. Я добавляю URL в этот экземпляр. –
Вот пример отправки запроса 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);
}
В .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
(предварительно -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' –
, и вы можете предоставить свои собственные тестовые примеры, если вы хотеть. Ниже приведен пример его запуска и других методов кодирования, которые показывают различия. Https://dotnetfiddle.net/12IFw1 – Maslow
WebUtility.UrlEncode() и WebUtility.UrlDecode() - 4.5+. Они не существуют в 4.0. –
System.Net.WebUtility.HtmlDecode
Этот ответ неверен! – Elmue
Почему это неправильно? –
Класс WebUtility предоставляет методы кодирования и декодирования URL-адресов при обработке веб-запросов. Он делает то же самое, что и HttpUtility, но это из пространства имен System.Web. –
Ответы здесь очень хорошо, но все же недостаточно для меня.
я написал небольшую петлю, которая сравнивает 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 не должен содержать зарезервированные символы '='
и ';'
.
хороший анализ и разбивка здесь, очень полезно. если кто-то знает или знает тесты производительности (сравнивая все три метода), которые также были бы хороши, чтобы видеть –
. Это хороший анализ, и вынос заключается в том, что вы не должны использовать 'Uri.EscapeUriString', потому что избежать полного URI невозможно делать последовательно. См. [Этот ответ] (http://stackoverflow.com/a/34189188/1488656) для подробного объяснения. – Livven
К UrlEncode без использования System.Web:
String s = System.Net.WebUtility.UrlEncode(str);
//fix some different between WebUtility.UrlEncode and HttpUtility.UrlEncode
s = Regex.Replace(s, "(%[0-9A-F]{2})", c => c.Value.ToLowerInvariant());
более
детали: https://www.samnoble.co.uk/2014/05/21/beware-webutility-urlencode-vs-httputility-urlencode/
Не могли бы вы показать, как вы выполнять вызов на веб-сайт? Может быть, есть что-то, что можно сделать там. –
Из любопытства, как вы называете сайт данными без использования System.Web? –
@Patrick, он, вероятно, использует 'WebRequest' или' WebClient'. Именно по этой причине я спросил об этом конкретном коде, потому что есть вещи, которые можно сделать в отношении правильных данных кодирования url. –