¿Cómo se UrlEncode sin usar System.Web?

Estoy tratando de escribir una aplicación de cliente de Windows que llama a un sitio web para obtener datos. Para mantener la instalación al mínimo, solo bash usar dlls en .NET Framework Client Profile . El problema es que necesito UrlEncode algunos parámetros, ¿hay una manera fácil de hacerlo sin importar System.Web.dll que no es parte de Client Pofile?

System.Uri.EscapeUriString() puede ser problemático con ciertos caracteres, para mí fue un número / libra ‘#’ signo en la cadena.

Si ese es un problema para ti, intenta:

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

Aquí hay una respuesta a la pregunta SO que explica la diferencia:

¿Cuál es la diferencia entre EscapeUriString y EscapeDataString?

y recomienda usar Uri.EscapeDataString() en cualquier aspecto.

En .Net 4.5+ usa WebUtility

Solo por el formato estoy enviando esto como una respuesta.

No pude encontrar ningún buen ejemplo que los compare así que:

 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)); 

Productos:

 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 

En .Net 4.5+ usa WebUtility .UrlEncode

Esto parece replicar HttpUtility.UrlEncode (pre-v4.0) para los caracteres más comunes:
Uri.EscapeDataString(testString).Replace("%20", "+").Replace("'", "%27").Replace("~", "%7E")
Nota: EscapeUriString mantendrá una cadena de uri válida, lo que hace que use tantos caracteres de texto sin cifrar como sea posible.

Vea esta respuesta para una tabla que compara las diversas codificaciones:
https://stackoverflow.com/a/11236038/555798

Saltos de línea Todos los listados aquí (que no sean HttpUtility.HtmlEncode ) convertirán "\n\r" en %0a%0d o %0A%0D

Por favor, siéntase libre de editar esto y agregar nuevos caracteres a mi cadena de prueba, o dejarlos en los comentarios y lo editaré.

Las respuestas aquí son muy buenas, pero aún son insuficientes para mí.

Escribí un pequeño bucle que compara Uri.EscapeUriString con Uri.EscapeDataString para todos los caracteres de 0 a 255.

NOTA: Ambas funciones tienen la inteligencia incorporada de que los caracteres que están por encima de 0x80 son los primeros codificados en UTF-8 y luego codificados en porcentaje.

Aquí está el resultado:

 ******* 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 se usará para codificar URL, mientras que EscapeDataString se usará para codificar, por ejemplo, el contenido de una Cookie, ya que los datos de Cookie no deben contener los caracteres reservados '=' y ';' .

Hay una versión utilizable del perfil del cliente, clase System.Net.WebUtility, presente en el perfil del cliente System.dll. Aquí está el enlace de MSDN:

WebUtility

A continuación, se incluye un ejemplo de envío de una solicitud POST que codifica correctamente los parámetros mediante application/x-www-form-urlencoded content type:

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

Para UrlEncode sin usar 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()); 

más detalles: https://www.samnoble.co.uk/2014/05/21/beware-webutility-urlencode-vs-httputility-urlencode/

 System.Net.WebUtility.HtmlDecode