URL Кодирует все не альфа, числовая в C#

Я должен к полностью URL Закодировать адрес электронной почты.

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

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

/Users/me@example.com/Comments

Поскольку мой шаблон WebMethod uri похож на это:

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

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

Править

Я рассмотрел использование:

Convert.ToBase64String(Encoding.ASCII.GetBytes("something+me@example.com"))

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

7
задан Arjan Einbu 18 June 2010 в 19:36
поделиться

4 ответа

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

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

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

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

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

0
ответ дан 7 December 2019 в 18:39
поделиться

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

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

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

2
ответ дан 7 December 2019 в 18:39
поделиться

Используйте шестнадцатеричный. Есть ConvertTo и 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("don.joe@gmail.com");
        Console.WriteLine(hex);
        Console.ReadLine();
        string stringValue =
        ConvertToString(hex);
        Console.WriteLine(stringValue);
        Console.ReadLine();

    }
0
ответ дан 7 December 2019 в 18:39
поделиться

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

Dim Encoded as New StringBuilder()

For Each Ch as Char In "something+me@example.com"
    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
ответ дан 7 December 2019 в 18:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: