.Net Uri Encoding RFC 2396 против RFC 3986

Во-первых, некоторый быстрый фон... Как часть интеграции с сторонним поставщиком, у меня есть веб-приложение С#.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. Мое приложение С#.Net вычисляет хэш на основе представления RFC 3986, которое %C3%BC. Излишне говорить, что наши хэши не совпадают, и я бросаю свои ошибки.

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

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

В противном случае существует ли простой способ преобразования октетных пар RFC 3986 в октеты RFC 2396?

+8
источник поделиться
3 ответа

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

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

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

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

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

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

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

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

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

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

+2
источник

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

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

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

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

+1
источник

Я не знаю стандартную кодировку для конструкторов 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
+1
источник

Посмотрите другие вопросы по меткам или Задайте вопрос