2010-06-18 32 views
7

Necesito completar la URL Codificar una dirección de correo electrónico.URL Codificar todo no alfanumérico en C#

¡HttpUtility.UrlEncode parece ignorar ciertos caracteres como! y.

tengo que pasar una dirección de correo electrónico en una dirección URL con formato como esto:

/Users/[email protected]/Comments 

Debido a mi plantilla WebMethod uri se ve así:

[WebGet(UriTemplate = "Users/{emailAddress}/Comments")] 

El WCF período se rompe y no pasar el dirección de correo electrónico a mi método de servicio web REST. Eliminar el período pasa el valor muy bien. Espero que haya un método que codificará todos los caracteres alfanuméricos, ya que todo lo que consuma este servicio deberá hacer esto.

EDITAR

que había considerado el uso de:

Convert.ToBase64String(Encoding.ASCII.GetBytes("[email protected]")) 

mayoría de las otras lenguas tienen formas sencillas para convertir una cadena a base 64? Mi principal preocupación es que nuestros clientes que consuman este servicio necesiten codificar la dirección de correo electrónico usando Java, PHP, Ruby, etc.

+0

reformateado un poco. – Femaref

+0

¿Qué tipo de error está recibiendo? –

+0

A 404 Not Found – Vyrotek

Respuesta

0

He descubierto una solución a este problema.

.Net 4.0 ha solucionado el problema con caracteres especiales en la plantilla URI.

Este hilo me apuntó en la dirección correcta. http://social.msdn.microsoft.com/Forums/en/dataservices/thread/b5a14fc9-3975-4a7f-bdaa-b97b8f26212b

Agregué todas las configuraciones de configuración y funcionó. Pero tenga en cuenta que SOLAMENTE funciona con una configuración REAL IIS con .Net 4.0. Parece que no puedo hacer que funcione con Visual Studio Dev IIS.

Actualización - En realidad, traté de eliminar las configuraciones de configuración y todavía funciona. Es posible que .Net 4.0 haya solucionado este problema de forma predeterminada.

0

Usar hex. Hay un ConvertTo y un De y una prueba de muestra ...

También puede simplemente escabullir los caracteres que no coinciden de la A a la Z utilizando una expresión regular para que su URL se vea bonita.

devolverá una lista grande de los números por lo que debe ser bueno

 public static string ConvertToHex(string asciiString) 
    { 
     var hex = ""; 
     foreach (var c in asciiString) 
     { 
      int tmp = c; 
      hex += String.Format("{0:x2}", Convert.ToUInt32(tmp.ToString())); 
     } 
     return hex; 
    } 

    public static string ConvertToString(string hex) 
    { 
     var stringValue = ""; 
     // While there's still something to convert in the hex string 
     while (hex.Length > 0) 
     { 
      stringValue += Convert.ToChar(Convert.ToUInt32(hex.Substring(0, 2), 16)).ToString(); 
      // Remove from the hex object the converted value 
      hex = hex.Substring(2, hex.Length - 2); 
     } 

     return stringValue; 
    } 

    static void Main(string[] args) 
    { 
     string hex = ConvertToHex("[email protected]"); 
     Console.WriteLine(hex); 
     Console.ReadLine(); 
     string stringValue = 
     ConvertToString(hex); 
     Console.WriteLine(stringValue); 
     Console.ReadLine(); 

    } 
2

Aquí es una expresión regular potencial que podría utilizar para llevar a cabo la codificación.

Regex.Replace(s, @"[^\w]", m => "%" + ((int)m.Value[0]).ToString("X2"));

no estoy seguro de que no hay un método definido marco existente para codificar estrictamente todos los caracteres no alfanuméricos que podría apuntar a sus clientes.

0

Si no me equivoco, la codificación URL es simplemente el signo de porcentaje seguido por el número ASCII (en hexadecimal), así que esto debería funcionar ...

Dim Encoded as New StringBuilder() 

For Each Ch as Char In "[email protected]" 
    If Char.IsLetterOrDigit(Ch) 
     Encoded.Append(Ch) 
    Else 
     Encoded.Append("%") 
     Dim Byt as Byte = Encoding.ASCII.GetBytes(Ch)(0) 
     Encoded.AppendFormat("{0:x2}", Byt) 
    End If 
Next 

Los resultados de código anterior en something%2Bme%40example.com

+0

Disculpa que utilizo VB.NET, pero puedes cambiarlo fácilmente: http://codechanger.com/ –

+0

¿Cómo decodificarías esto? – Vyrotek

+0

@Vyrotek Puede confiar en 'Uri.UnescapeDataString()' para eso. –