Кодировка.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