2008-08-18 7 views
58

Normalmente yo sólo tiene que utilizar:UrlEncode a través de una aplicación de consola?

HttpContext.Current.Server.UrlEncode("url"); 

Pero como esto es una aplicación de consola, HttpContext.Current siempre va a ser null.

¿Hay algún otro método que haga lo mismo que yo podría usar?

Respuesta

66

¡Pruebe esto!

Uri.EscapeUriString(url); 

O

Uri.EscapeDataString(data) 

No hay necesidad de hacer referencia a System.Web.

Editar: favor ver another responder SO para obtener más ...

+0

No estoy seguro de por qué se votó negativamente; tal vez la edición solucionó algo? De todos modos, es una buena respuesta. Para obtener más información, consulte [esta respuesta] (http://stackoverflow.com/a/8451941/530545) de otra pregunta similar. – Granger

+0

Funciona muy bien y no necesita agregar ninguna referencia. –

+3

gracias por proporcionar una respuesta, no una respuesta NO. – sonjz

72

Yo no soy un tipo .NET, pero, ¿no puedes usar:

HttpUtility.UrlEncode Method (String) 

que se describe aquí:

HttpUtility.UrlEncode Method (String) on MSDN

+3

no quiero a la lluvia en un desfile de todos, pero el mencionado HttpUtility.UrlEncode no parece ser visible incluso cuando incluye "usar System.Web". ¿Esto realmente funciona para alguien y, de ser así, puede incluir el código real? –

+25

Necesita (debe) agregar System.Web como referencia. Simplemente poner usando System.Web no es suficiente – Anjisan

+0

Sabía sobre System.Web.HttpContext pero no estaba resolviendo. Gracias Anjisan por señalar que necesitaba agregar System.Web como referencia. +1 de mi parte –

1

HttpUtility.UrlEncode ("url") en System.Web.

1

utilizan el método estático HttpUtility.UrlEncode.

6

Usted querrá utilizar

System.Web.HttpUtility.urlencode("url") 

Asegúrese de que ha System.web como una de las referencias en su proyecto. No creo que esté incluido como referencia por defecto en las aplicaciones de la consola.

3

Me encontré con este problema yo mismo, y en lugar de agregar el ensamblado System.Web a mi proyecto, escribí una clase para codificar/descodificar URL (es bastante simple, y he hecho algunas pruebas, pero no mucho) He incluido el código fuente a continuación. Por favor: deja el comentario en la parte superior si vuelves a usar 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 
+0

Parece que funciona. Gracias. – Echilon

+3

downvoted ... escribiendo tu propio código para que puedas evitar una referencia a una lib estándar que no escriba es "A Bad Thing" típicamente. –

+0

Tengo que estar de acuerdo con Justin aquí –

2

Kibbee ofrece la respuesta real. Sí, HttpUtility.UrlEncode es el método correcto para usar, pero no estará disponible por defecto para una aplicación de consola. Usted debe agregar una referencia a System.Web. Para hacer eso,

  1. En el explorador de soluciones, haga clic en referencias
  2. seleccione "Agregar referencia"
  3. En el cuadro de diálogo "Agregar referencia", utilice la ficha .NET
  4. de desplazamiento hacia abajo para System.Web, seleccione eso y pulse Aceptar

AHORA puede usar el método UrlEncode. Usted todavía desea añadir,

using System.Web

en la parte superior de la aplicación de consola o utilizar el espacio de nombres completo al llamar al método,

System.Web.HttpUtility.UrlEncode (someString)

13

El código de Ian Hopkins hace el truco para mí sin tener que agregar una referencia a System.Web. Aquí hay un puerto para C# para aquellos que no están usando 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)); 
    } 
} 
+1

Gran trabajo tanto t3rse como Ian Hopkins. Me encontré con este problema construyendo una aplicación wpf. wpf usa el 'perfil de cliente' adelgazado de .net mientras mi biblioteca de clase usaba la versión completa. Solo la versión completa de .net tiene acceso a System.Web que contiene HttpUtility.UrlEncode. – MrSharps

3

Uso WebUtility.UrlEncode(string) del espacio de nombres System.Net

+1

Es bueno mencionar que este método está disponible desde .NET 4.0. –

0

Lo mejor es añadir una referencia a System.web..dll

y el uso var EncodedUrl = System.Web.HttpUtility.UrlEncode ("URL_TEXT");

Puede encontrar el archivo en System.web.dll

0

Uri.EscapeUriString no se debe utilizar para escapar de una cadena que se pasa en una dirección URL, ya que no codifica todos los caracteres como se podría esperar. El '+' es un buen ejemplo que no se escapó. Esto luego se convierte a un espacio en la URL, ya que esto es lo que significa en un URI simple. Obviamente, esto causa problemas masivos 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, entonces no veo ninguna razón por la que no deba hacer esto).

Alternativamente, puede utilizar Uri.EscapeDataString sobre Uri.EscapeUriString como se explica muy bien aquí: https://stackoverflow.com/a/34189188/7391

Cuestiones relacionadas