Кодировка .Net Uri RFC 2396 против RFC 3986 - PullRequest
8 голосов
/ 12 августа 2011

Во-первых, немного предыстории ... В рамках интеграции со сторонним поставщиком у меня есть веб-приложение на 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 ]

2 голосов
/ 12 августа 2011

Ничего общего с вашим вопросом, но почему вы создаете новый 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.

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

1 голос
/ 12 августа 2011

Я не знаю о стандартной кодировке для конструкторов 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 голос
/ 12 августа 2011

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

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

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

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

...