2010-06-18 1 views
7

Мне нужно полностью URL-адрес Кодировать адрес электронной почты.URL-адрес Кодировать все не-буквенные числа в C#

HttpUtility.UrlEncode, похоже, игнорирует некоторые символы, такие как! а также .

Мне нужно передать адрес электронной почты в URL отформатированные как это:

/Users/[email protected]/Comments 

Потому что мой шаблон WebMethod URI выглядит следующим образом:

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

период перерывы WCF и не проедет адрес электронной почты для моего метода веб-службы REST. Удаление периода передает значение просто отлично. Я надеюсь, что есть метод, который будет кодировать все неабедические числовые символы, так как все, потребляющие эту услугу, должны будут это сделать.

EDIT

я рассматривал возможность использования:

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

У большинства других языков есть простой способ, чтобы преобразовать строку в base64? Моя главная проблема заключается в том, что нашим клиентам, которые потребляют эту услугу, необходимо будет закодировать адрес электронной почты с помощью Java, PHP, Ruby и т. Д.

+0

немного перестроен. – Femaref

+0

Какая ошибка вы получаете? –

+0

A 404 Не найдено – Vyrotek

ответ

0

Я нашел решение этой проблемы.

.Net 4.0 фактически устранил проблему со специальными символами в шаблоне URI.

Эта нить указала мне в правильном направлении. http://social.msdn.microsoft.com/Forums/en/dataservices/thread/b5a14fc9-3975-4a7f-bdaa-b97b8f26212b

Я добавил все настройки конфигурации, и он сработал. Но учтите, что он ТОЛЬКО работает с настройкой REAL IIS с .Net 4.0. Я не могу заставить его работать с Visual Studio Dev IIS.

Обновление. На самом деле, я попытался удалить эти настройки конфигурации, и он все еще работает. Возможно, что .Net 4.0 исправил эту проблему по умолчанию.

0

Используйте hex. Существует ConvertTo и a From и образец теста ...

Вы также можете просто скопировать символы, не совпадающие с A-Z, с помощью регулярного выражения, чтобы ваш URL-адрес выглядел довольно красиво.

Это возвращает большой список номеров, так что вы должны быть хорошо

 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

Вот потенциал Regex вы могли бы использовать для выполнения кодирования.

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

Я не уверен, что есть существующий метод рамки, определенные строго кодировать все не алфавитно-цифровые символы, которые вы могли бы указать ваши клиенты.

0

Если я не ошибаюсь, URL Encoding просто знак процента с последующим номером ASCII (в шестнадцатеричном виде), так что это должно работать ...

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 

Приведенные выше результаты кода в something%2Bme%40example.com

+0

Извините, что я использую VB.NET, но вы можете легко изменить это: http://codechanger.com/ –

+0

Как бы вы декодировали это? – Vyrotek

+0

@ Vytrotek Вы можете положиться на 'Uri.UnescapeDataString()' для этого. –

 Смежные вопросы

  • Нет связанных вопросов^_^