¿UrlEncode a través de una aplicación de consola?
Pregunta
Normalmente solo usaría:
HttpContext.Current.Server.UrlEncode("url");
Pero como se trata de una aplicación de consola, HttpContext.Current
siempre va a ser null
.
¿Existe otro método que haga lo mismo que pueda usar?
Solución
¡Prueba esto!
Uri.EscapeUriString(url);
O
Uri.EscapeDataString(data)
No es necesario hacer referencia a System.Web.
Editar: Por favor mira otro Así que responda para más...
Otros consejos
No soy un tipo de .NET, pero ¿no puedes usar?
HttpUtility.UrlEncode Method (String)
Que se describe aquí:
El código de Ian Hopkins me funciona sin tener que agregar una referencia a System.Web.Aquí hay una adaptación a C# para aquellos que no usan VB.NET:
/// <summary>
/// URL encoding class. Note: use at your own risk.
/// Written by: Ian Hopkins (http://www.lucidhelix.com)
/// Date: 2008-Dec-23
/// (Ported to C# by t3rse (http://www.t3rse.com))
/// </summary>
public class UrlHelper
{
public static string Encode(string str) {
var charClass = String.Format("0-9a-zA-Z{0}", Regex.Escape("-_.!~*'()"));
return Regex.Replace(str,
String.Format("[^{0}]", charClass),
new MatchEvaluator(EncodeEvaluator));
}
public static string EncodeEvaluator(Match match)
{
return (match.Value == " ")?"+" : String.Format("%{0:X2}", Convert.ToInt32(match.Value[0]));
}
public static string DecodeEvaluator(Match match) {
return Convert.ToChar(int.Parse(match.Value.Substring(1), System.Globalization.NumberStyles.HexNumber)).ToString();
}
public static string Decode(string str)
{
return Regex.Replace(str.Replace('+', ' '), "%[0-9a-zA-Z][0-9a-zA-Z]", new MatchEvaluator(DecodeEvaluator));
}
}
Querrás usar
System.Web.HttpUtility.urlencode("url")
Asegúrate de tener system.web como una de las referencias en tu proyecto.No creo que esté incluido como referencia por defecto en las aplicaciones de consola.
Intente utilizar el método UrlEncode en la clase HttpUtility.
Yo mismo me encontré con este problema y, en lugar de agregar el ensamblado System.Web a mi proyecto, escribí una clase para codificar/decodificar URL (es bastante simple y he realizado algunas pruebas, pero no muchas).He incluido el código fuente a continuación.Por favor:deja el comentario en la parte superior si reutilizas esto, no me culpes si se rompe, aprende del código.
''' <summary>
''' URL encoding class. Note: use at your own risk.
''' Written by: Ian Hopkins (http://www.lucidhelix.com)
''' Date: 2008-Dec-23
''' </summary>
Public Class UrlHelper
Public Shared Function Encode(ByVal str As String) As String
Dim charClass = String.Format("0-9a-zA-Z{0}", Regex.Escape("-_.!~*'()"))
Dim pattern = String.Format("[^{0}]", charClass)
Dim evaluator As New MatchEvaluator(AddressOf EncodeEvaluator)
' replace the encoded characters
Return Regex.Replace(str, pattern, evaluator)
End Function
Private Shared Function EncodeEvaluator(ByVal match As Match) As String
' Replace the " "s with "+"s
If (match.Value = " ") Then
Return "+"
End If
Return String.Format("%{0:X2}", Convert.ToInt32(match.Value.Chars(0)))
End Function
Public Shared Function Decode(ByVal str As String) As String
Dim evaluator As New MatchEvaluator(AddressOf DecodeEvaluator)
' Replace the "+"s with " "s
str = str.Replace("+"c, " "c)
' Replace the encoded characters
Return Regex.Replace(str, "%[0-9a-zA-Z][0-9a-zA-Z]", evaluator)
End Function
Private Shared Function DecodeEvaluator(ByVal match As Match) As String
Return "" + Convert.ToChar(Integer.Parse(match.Value.Substring(1), System.Globalization.NumberStyles.HexNumber))
End Function
End Class
Usar WebUtility.UrlEncode(string)
de System.Net
espacio de nombres
Kibbee ofrece la verdadera respuesta.Sí, HttpUtility.UrlEncode es el método correcto a utilizar, pero no estará disponible de forma predeterminada para una aplicación de consola.Tú debe agregue una referencia a System.Web.Para hacer eso,
- En su explorador de soluciones, haga clic derecho en referencias
- Elija "añadir referencia"
- En el cuadro de diálogo "Agregar referencia", use la pestaña .NET
- Desplácese hacia abajo hasta System.Web, selecciónelo y presione Aceptar
AHORA puedes usar el método UrlEncode.Aún querrás agregar,
usando System.Web
en la parte superior de la aplicación de su consola o use el espacio de nombres completo al llamar al método,
System.Web.HttpUtility.UrlEncode (alguna cadena)
HttpUtility.UrlEncode("url") en System.Web.
utilice el método estático HttpUtility.UrlEncode.
Lo mejor es agregar una referencia a System.web..dll
y use var encodedUrl = system.web.httputility.urlencode ("url_text");
Puede encontrar el archivo en System.web.dll
Uri.EscapeUriString no debe usarse para escapar de una cadena que se pasará en una URL, ya que no codifica todos los caracteres como se podría esperar.El '+' es un buen ejemplo que no se escapa.Luego, esto se convierte en un espacio en la URL, ya que esto es lo que significa en una URI simple.Obviamente, eso causa grandes problemas en el momento en que intentas pasar algo como una cadena codificada en base 64 en la URL y aparecen espacios en toda la cadena en el extremo receptor.
Puede usar HttpUtility.UrlEncode y agregar las referencias requeridas a su proyecto (y si se está comunicando con una aplicación web, no veo ninguna razón por la que no deba hacer esto).
Alternativamente, use Uri.EscapeDataString sobre Uri.EscapeUriString como se explica muy bien aquí: https://stackoverflow.com/a/34189188/7391