Кодировка .NET Uri RFC 2396 vs 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

моя проблема возникает из строк запроса, которые содержат специальные символы, такие как umlaut (ü). Поставщик вычисляет свой хэш на основе представления 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); – atticae

+1 для atticae! Я вернулся, чтобы попытаться удалить посторонний Uri, который я создавал, и внезапно строка имела кодировку umlaut как 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.

интересно, если один из системы.Текст.Методы кодирования для преобразования исходных данных в обычную строку .Net могут помочь.

этот вопрос тоже может представлять интерес:кодировать и декодировать URLs rfc2396


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

на HttpUtility-Class есть UrlDecode() и UrlEncode() метод, который позволяет указать