Estoy tratando de escribir una aplicación cliente de Windows que llame a un sitio web para obtener datos. Para mantener la instalación al mínimo, estoy intentando usar solo 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 del Client Pofile?
c#
.net
urlencode
.net-client-profile
Martin Brown
fuente
fuente
WebRequest
oWebClient
. Esa es la razón por la que pregunté sobre este código en particular porque hay cosas que se pueden hacer para codificar correctamente los datos de URL.Respuestas:
System.Uri.EscapeUriString()
puede ser problemático con ciertos caracteres, para mí fue un signo de número / libra '#' en la cadena.Si eso es un problema para usted, intente:
Aquí hay una respuesta de pregunta SO que explica la diferencia:
¿Cuál es la diferencia entre EscapeUriString y EscapeDataString?
y recomienda usar
Uri.EscapeDataString()
en cualquier aspecto.fuente
Uri.EscapeUriString
es realmente muy problemático y no debe usarse, ya que trata de hacer algo (escapar de los URI completos) que en realidad es imposible de hacer de manera consistente. Consulte esta respuesta para obtener una explicación detallada.En .Net 4.5+ uso
WebUtility
Solo por formatear estoy enviando esto como respuesta.
No pude encontrar buenos ejemplos comparándolos así:
Salidas:
En .Net 4.5+ uso
WebUtility
.UrlEncode
Esto parece replicarse
HttpUtility.UrlEncode
(anterior a la v4.0) para los caracteres más comunes:Uri.EscapeDataString(testString).Replace("%20", "+").Replace("'", "%27").Replace("~", "%7E")
Nota:
EscapeUriString
mantendrá una cadena uri válida, lo que hace que use tantos caracteres de texto sin formato 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 enumerados aquí (que no sean
HttpUtility.HtmlEncode
) se convertirán"\n\r"
en%0a%0d
o%0A%0D
Siéntase libre de editar esto y agregar nuevos caracteres a mi cadena de prueba, o dejarlos en los comentarios y lo editaré.
fuente
EscapeDataString
en lugar deEscapeUriString
como estábamos codificación de retornos de carro y avances de línea y éstos se requiere el más agresivo escape que realizado porEscapeDataString
Puedes usar
Uri.EscapeUriString (ver http://msdn.microsoft.com/en-us/library/system.uri.escapeuristring.aspx )
fuente
Uri.EscapeUriString
. No "comprende" qué partes deben codificarse, es solo un intento equivocado de hacer algo (escapar de los URI completos) que en realidad es imposible de hacer de manera consistente. Vea esta respuesta para una explicación detallada.Las respuestas aquí son muy buenas, pero aún son insuficientes para mí.
Escribí un pequeño bucle que se compara
Uri.EscapeUriString
conUri.EscapeDataString
todos los caracteres del 0 al 255.NOTA: Ambas funciones tienen la inteligencia incorporada de que los caracteres superiores a 0x80 se codifican primero con UTF-8 y luego con un porcentaje.
Aquí está el resultado:
EscapeUriString
debe usarse para codificar URL, mientrasEscapeDataString
que debe usarse para codificar, por ejemplo, el contenido de una Cookie, porque los datos de Cookie no deben contener los caracteres reservados'='
y';'
.fuente
Uri.EscapeUriString
, porque escapar de los URI completos es imposible de hacer de manera consistente. Vea esta respuesta para una explicación detallada.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
fuente
Aquí hay un ejemplo de envío de una solicitud POST que codifica correctamente los parámetros utilizando el
application/x-www-form-urlencoded
tipo de contenido:fuente
Para UrlEncode sin usar System.Web:
Más detalles: https://www.samnoble.co.uk/2014/05/21/beware-webutility-urlencode-vs-httputility-urlencode/
fuente
fuente