Расшифруйте экранированный URL без использования HttpUtility.UrlDecode - PullRequest
34 голосов
/ 27 октября 2008

Есть ли какая-нибудь функция, которая преобразует экранированную строку Url в ее неэкранированную форму? System.Web.HttpUtility.UrlDecode() может выполнить эту работу, но я не хочу добавлять ссылку на System.Web.dll. Поскольку мое приложение не является веб-приложением, я не хочу добавлять зависимость только для использования функции в сборке.

ОБНОВЛЕНИЕ: Проверка Сообщение Рика Страла в блоге о той же проблеме.

Ответы [ 8 ]

61 голосов
/ 27 октября 2008

РЕДАКТИРОВАТЬ: Используйте статический метод Uri.UnescapeDataString() для декодирования ваших URL:

Закодировано: http%3a%2f%2fwww.google.com%2fsearch%3fhl%3den%26q%3dsomething%20%2323%26btnG%3dGoogle%2bSearch%26aq%3df%26oq%3d

Расшифровано: http://www.google.com/search?hl=en&q=something #23&btnG=Google+Search&aq=f&oq=

6 голосов
/ 26 ноября 2015

Если вы используете .NET 4.0 или более позднюю версию, вы можете использовать WebUtility.UrlDecode , который работает с профилем клиента, а также правильно обрабатывает знаки плюс (см. это обсуждение).

4 голосов
/ 27 октября 2008

Не загружайте System.Web.dll - как уже отмечали другие, не стоит волноваться, если вы не знаете, что вам нужно иметь дело с клиентами, которые могут не иметь этого («профиль клиента», «компактная структура», "микро рамки", "серебряный свет").

Re пробел; это не будет много на самом деле; обратите внимание, что сборки .NET JITted основаны на методах для каждого метода, поэтому при использовании нескольких методов не будет существенных накладных расходов.

Реальная проблема (IMO) - это уровень уверенности в том, что у клиента есть System.Web.dll; если вы счастливы, что они используют полный фреймворк, просто сделайте это.

1 голос
/ 24 ноября 2011

@ Smith
У меня была проблема с сохранением. Без изменений или просто повторение.

После тестирования многих вещей я заметил, что тестовая строка декодировала. В конечном итоге мне пришлось создать новую пустую строку, установить ее значение в кодированную строку, а затем запустить WebUtility.HtmlDecode и Uri.UnescapeDataString для новой строки. По какой-то причине мне пришлось запустить декодирование и удаление в указанном порядке. Bizarre.

Я решил что-то вроде этого.

Dim strEncoded as string="http%3a%2f%2fwww.google.com%2fsearch%3fhl%3den%26q%3dsomething%20%2323%26btnG%3dGoogle%2bSearch%26aq%3df%26oq%3d"

Dim strDecoded as string = ""
strDecoded = strEncoded
strDecoded = WebUtility.HtmlDecode(strDecoded)
strDecoded = Uri.UnescapeDataString(strDecoded)
0 голосов
/ 06 апреля 2019

Просто немного понимания того, почему это отличается. Один преобразуется в верхний регистр, а другой преобразуется в нижний регистр. Таким образом, декодирование зависит от типа кодирования.

System.Net.WebUtility (внутренний) + 65 :

private static char IntToHex(int n)
{
    if (n <= 9)
        return (char) (n + 48);
    else
        return (char) (n - 10 + 65);
}

System.Web.Util.HttpEncoderUtility (Внутренний) - + 97

public static char IntToHex(int n)
{
    if (n <= 9)
        return (char) (n + 48);
    else
        return (char) (n - 10 + 97);
}

Пример

var test1 = WebUtility.UrlEncode("http://www.test.com/?param1=22&param2=there@is<a space");
var test2 = HttpUtility.UrlEncode("http://www.test.com/?param1=22&param2=there@is<a space");

Ответ

test1 -> http%3A%2F%2Fwww.test.com%2F%3Fparam1%3D22%26param2%3Dthere%40is%3Ca+space
test2 -> http%3a%2f%2fwww.test.com%2f%3fparam1%3d22%26param2%3dthere%40is%3ca+space

Подробнее ...

0 голосов
/ 09 мая 2012

System.Net.WebUtility.HtmlDecode также работает с клиентским профилем .NET 4.0.

0 голосов
/ 27 октября 2008

У вас уже ОГРОМНАЯ зависимость от .NET Framework, CLR etal. Итак, на самом деле у вас уже есть косвенная зависимость от System.Web.DLL; Ваше приложение НЕ МОЖЕТ ЗАПУСКАТЬ без его присутствия на локальной машине.

А тебя беспокоит память? У вас есть проблемы с памятью? Если у вас настолько острые проблемы с памятью, что вы не можете загрузить пару килобайт DLL в память вашего приложения, то почему вы кодируете .NET? Или вы просто преждевременно оптимизируете?

Так что не беспокойся об этом.

0 голосов
/ 27 октября 2008

Команда Microsoft ACE имеет расширенную (и лучшую) версию декодирования в библиотеке Anti-XSS . Однако я не уверен, что это просто проходит.

(если честно, я не понимаю, почему вы так беспокоитесь о зависимости от System.web.dll)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...