2010-10-01 3 views
256

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

+0

Не могли бы вы показать, как вы выполнять вызов на веб-сайт? Может быть, есть что-то, что можно сделать там. –

+0

Из любопытства, как вы называете сайт данными без использования System.Web? –

+0

@Patrick, он, вероятно, использует 'WebRequest' или' WebClient'. Именно по этой причине я спросил об этом конкретном коде, потому что есть вещи, которые можно сделать в отношении правильных данных кодирования url. –

ответ

246

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

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

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

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

What's the difference between EscapeUriString and EscapeDataString?

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

+1

False: http://blogs.msdn.com/b/yangxind/archive/2006/11/09/don-t-use-net-system-uri-unescapedatastring-in-url-decoding.aspx У вас будет проблемы с плюсовыми знаками, поскольку они не будут незакодированы. –

+5

Это сообщение в блоге немного устарело, и у меня просто «Uri Escaped» полный url, и все пробелы стали% 20, поэтому я думаю, что они исправили это. Я использую .Net 4.5. – Rodi

+0

EscapeDataString также не поддерживает очень длинные строки, если вы готовите данные для операции POST. http://stackoverflow.com/questions/6695208/uri-escapedatastring-invalid-uri-the-uri-string-is-too-long –

15

В клиентском профиле System.dll присутствует гостевая версия, класс System.Net.WebUtility. Вот MSDN Ссылка:

WebUtility

+0

К сожалению, там нет метода 'UrlEncode'. –

+0

ahh well, fail for me = (Вы просматриваете когда-либо один вопрос о переполнении стека? – Sprague

+1

только те, что меня интересуют. –

50

Вы можете использовать

Uri.EscapeUriString (см http://msdn.microsoft.com/en-us/library/system.uri.escapeuristring.aspx)

+0

Есть ли разница между этим и EscapeDataString? –

+3

Вы хотите использовать EscapeUriString.EscapeUriString будет пытаться кодировать весь URL-адрес (включая http: // part), в то время как EscapeUriString понимает, какие части должны быть закодированы. –

+1

Я вижу, поэтому в этом случае мне, вероятно, понадобится EscapeDataString, поскольку я могу передать URL-адрес как get параметр. Я добавляю URL в этот экземпляр. –

8

Вот пример отправки запроса 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); 
} 
186

В .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

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

+0

В моем случае мне пришлось использовать 'EscapeDataString', а не' EscapeUriString', поскольку мы кодировали возврат каретки и линейные фиды, и для этого требовалось более агрессивное экранирование, выполненное с помощью 'EscapeDataString' –

+1

, и вы можете предоставить свои собственные тестовые примеры, если вы хотеть. Ниже приведен пример его запуска и других методов кодирования, которые показывают различия. Https://dotnetfiddle.net/12IFw1 – Maslow

+3

WebUtility.UrlEncode() и WebUtility.UrlDecode() - 4.5+. Они не существуют в 4.0. –

-2
System.Net.WebUtility.HtmlDecode 
+0

Этот ответ неверен! – Elmue

+0

Почему это неправильно? –

+0

Класс WebUtility предоставляет методы кодирования и декодирования URL-адресов при обработке веб-запросов. Он делает то же самое, что и HttpUtility, но это из пространства имен System.Web. –

16

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

я написал небольшую петлю, которая сравнивает 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 не должен содержать зарезервированные символы '=' и ';'.

+0

хороший анализ и разбивка здесь, очень полезно. если кто-то знает или знает тесты производительности (сравнивая все три метода), которые также были бы хороши, чтобы видеть –

+0

. Это хороший анализ, и вынос заключается в том, что вы не должны использовать 'Uri.EscapeUriString', потому что избежать полного URI невозможно делать последовательно. См. [Этот ответ] (http://stackoverflow.com/a/34189188/1488656) для подробного объяснения. – Livven

 Смежные вопросы

  • Нет связанных вопросов^_^