Pregunta

Estoy intentando escribir una aplicación de cliente de Windows que llama a un sitio web para los datos. Para mantener la instalación a un mínimo Estoy intentando utilizar sólo dlls en el .NET Framework Client Perfil . El problema es que necesito UrlEncode de algunos parámetros, ¿hay una manera fácil de hacer esto sin importar System.Web.dll que no forma parte de la pofile cliente?

¿Fue útil?

Solución

System.Uri.EscapeUriString() puede ser problemática con ciertos caracteres, para mí fue una libra signo de número / '#' en la cadena.

Si esto es un problema para usted, trate de:

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

Aquí hay una pregunta de respuesta de manera que explica la diferencia:

Cuál es la diferencia entre EscapeUriString y EscapeDataString?

y recomienda para uso Uri.EscapeDataString() en cualquier aspecto.

Otros consejos

En .Net 4.5+ uso WebUtility

Sólo para dar formato que estoy presentando esto como una respuesta.

No se pudo encontrar ningún ejemplo buenos comparándolos así:

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

Salidas:

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+ uso WebUtility .UrlEncode

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

Ver esta respuesta para un cuadro comparativo de las diferentes codificaciones:
https://stackoverflow.com/a/11236038/555798

saltos de línea Todos ellos figuran en esta lista (que no sea HttpUtility.HtmlEncode) convertirá en "\n\r" %0a%0d o %0A%0D

No dude en Editar y añadir nuevos personajes a mi cadena de prueba, o dejarlas en los comentarios y voy a editar la misma.

Las respuestas aquí son muy buenos, pero todavía insuficientes para mí.

Me escribió un pequeño bucle que se compara con Uri.EscapeUriString Uri.EscapeDataString para todos los caracteres del 0 al 255.

NOTA:. Ambas funciones tienen la inteligencia integrada que los caracteres anteriores son 0x80 primera codificación UTF-8 y luego por ciento codificado

Este es 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 va a utilizar a las URL de codificar, mientras EscapeDataString se va a utilizar para codificar, por ejemplo, el contenido de una galleta, porque los datos de cookies no deben contener los caracteres reservados '=' y ';'.

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

WebUtility

Este es un ejemplo de enviar una solicitud POST que codifica correctamente los parámetros utilizando el tipo de contenido 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);
}

Para UrlEncode de System.Web sin usar:

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 .es / 2014/05/21 / cuidado-webutility-urlencode-vs-httputility-urlencode /

System.Net.WebUtility.HtmlDecode
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top