Кодировка.Net Uri RFC 2396 против RFC 3986

Во-первых, немного предыстории... В рамках интеграции со сторонним поставщиком у меня есть веб-приложение на C# .Net, которое получает URL с кучей информации в строке запроса. Этот URL-адрес подписан хешем MD5 и общим секретным ключом. По сути, я извлекаю строку запроса, удаляю их хэш, выполняю свой собственный хэш для оставшейся строки запроса и проверяю, совпадает ли мой с предоставленным.

Я получаю Uri следующим образом...

Uri uriFromVendor = new Uri(Request.Url.ToString());
string queryFromVendor = uriFromVendor.Query.Substring(1); //Substring to remove question mark

Моя проблема проистекает из строк запроса, которые содержат специальные символы, такие как умляут (ü). Поставщик вычисляет их хэш на основе представления RFC 2396, которое %FC, Мое приложение на C# .Net вычисляет свой хэш на основе представления RFC 3986, которое %C3%BC, Излишне говорить, что наши хэши не совпадают, и я выбрасываю свои ошибки.

Странно, но в документации к классу Uri в.Net говорится, что он должен соответствовать RFC 2396, если не указано иное в RFC 3986, но у меня нет записи в моем web.config файл, который они говорят, требуется для этого поведения.

Как я могу заставить конструктор Uri использовать соглашение RFC 2396?

Если это не так, есть ли простой способ преобразовать пары октетов RFC 3986 в октеты RFC 2396?

3 ответа

Решение

Ничего общего с вашим вопросом, но почему вы создаете здесь новый Uri? Вы можете просто сделать string queryFromVendor = Request.Url.Query.Substring(1); - аттика

+1 за аттики! Я вернулся, чтобы попытаться удалить посторонний Uri, который я создавал, и внезапно в строке кодировался умлаут как UTF-8 вместо UTF-16.

Сначала я не думал, что это сработает. Где-то вдоль линии, я пытался получить URL с помощью Request.QueryString, но это заставляло умлаута проходить как %ufffd который является символом. Чтобы по-новому взглянуть, я попробовал предложение Аттики, и оно сработало.

Я почти уверен, что ответ связан с тем, что я прочитал здесь.

C# использует UTF-16 во всех своих строках, с инструментами для кодирования, когда дело доходит до работы с потоками и файлами, которые приводят нас к...

ASP.NET по умолчанию использует UTF-8, и трудно представить себе время, когда это не лучший выбор...

Мои проблемы возникли отсюда...

Uri uriFromVendor = new Uri(Request.Url.ToString());

Принимая Request.Url URI и создание другого URI, он был закодирован как стандарт C# UTF-16. Используя оригинальный URI, он остался в.Net стандарте UTF-8.

Спасибо всем за вашу помощь.

Мне интересно, если это немного красной сельди

Я говорю это, потому что FC - это UTF16-представление u с umlaut; C2BC - это представление UTF8.

Интересно, может ли помочь один из методов System.Text.Encoding для преобразования исходных данных в обычную строку.Net?

Этот вопрос также может быть интересен: кодировать и декодировать URL-адреса rfc2396

Я не знаю о стандартной кодировке для конструкторов Uri, но если все остальное терпит неудачу, вы всегда можете самостоятельно декодировать URL и кодировать его в любой кодировке, которая вам нравится.

HttpUtility-Class имеет UrlDecode() а также UrlEncode() метод, который позволяет вам указать System.Text.Encoding в качестве второго параметра.

Например:

string decodedQueryString = HttpUtility.UrlDecode(Request.Url.Query.Substring(1));
string encodedQueryString = HttpUtility.UrlEncode(decodedQueryString, System.Text.Encoding.GetEncoding("utf-16"));
// calc hash here
Другие вопросы по тегам