HttpServerUtility.UrlPathEncode versus HttpServerUtility.UrlEncode

¿Cuál es la diferencia entre HttpServerUtility.UrlPathEncode y HttpServerUtility.UrlEncode ? ¿Y cuándo debería elegir uno sobre el otro?

Actualización: a partir de 4.5, por referencia de MSDN, Microsoft recomienda usar solo UrlEncode. Además, la información que figura previamente en MSDN no describe completamente el comportamiento de los dos métodos; consulte los comentarios.

La diferencia está en el espacio que escapa: UrlEncode los escapa en el signo +, UrlPathEncode escapa a% 20. + y% 20 son solo equivalentes si son parte de la porción QueryString por W3C . Por lo tanto, no puede escapar la URL completa con el signo +, solo la porción de la cadena de consulta. La conclusión es que UrlPathEncode siempre es mejor

Puede codificar una URL usando el método UrlEncode () o el método UrlPathEncode (). Sin embargo, los métodos arrojan resultados diferentes. El método UrlEncode () convierte cada carácter de espacio en un carácter más (+). El método UrlPathEncode () convierte cada carácter de espacio en la cadena “% 20”, que representa un espacio en notación hexadecimal. Utilice el método UrlPathEncode () cuando codifique la parte de ruta de una URL para garantizar una URL decodificada consistente, independientemente de qué plataforma o navegador realice la deencoding.

http://msdn.microsoft.com/en-us/library/4fkewx0t.aspx

UrlEncode es útil para los valores de cadena de consulta (por lo que a la izquierda o especialmente, a la derecha, de cada =).

En esta url, foo , fooval , bar , y barval deberían CADA ser UrlEncode’d por separado:

http://www.example.com/whatever?foo=fooval&bar=barval

UrlEncode codifica todo, como?, &, =, Y /, caracteres acentuados u otros caracteres no ASCII, etc., en la encoding% -style, excepto el espacio que codifica como +. Esta es la encoding de estilo de formulario, y es mejor para algo que pretendes poner en la cadena de consulta (o tal vez entre dos barras en una url) como parámetro sin que se agote todo con los caracteres de control de la url (como &). De lo contrario, un valor lamentablemente colocado & or = en la entrada del formulario del usuario o valor del valor db podría romper las cosas.

EDITAR: Uri.EscapeDataString es una coincidencia muy cercana a UrlEncode, y puede ser preferible, aunque no conozco las diferencias exactas.

UrlPathEncode es útil para el rest de la cadena de consulta, afecta a todo a la izquierda de la?

En esta url, toda la url (de http a barval) debe ejecutarse a través de UrlPathEncode.

http://www.example.com/whatever?foo=fooval&bar=barval

UrlPathEncode NO codifica?, &, =, O /. SÍ, sin embargo, como UrlEncode, codifica caracteres acentuados / no ASCII con notación% y el espacio también se convierte en% 20. Esto es útil para asegurarse de que la URL sea válida, ya que los espacios y los caracteres acentuados no lo son. No tocará su cadena de consulta (¿todo a la derecha de?), Por lo que debe codificar eso con UrlEncode, arriba.