Как я могу избежать / и других символов в asp.net? - PullRequest
2 голосов
/ 04 февраля 2010

Когда я посещаю http://localhost:17357/u/a%2fa/m/ssd-10 и смотрю на HttpContext.Current.Request.Url в Application_BeginRequest, я вижу http://localhost:17357/u/a/a/m/ssd-10 а? я не должен получить http://localhost:17357/u/a%2fa/m/ssd-10? я думал, что смысл в том, чтобы избегать URL-адресов, так?, &, / и другие специальные символы не следует путать с их особым значением в URL-адресах. Может быть, есть конфиг, который мне нужно настроить?


Я создал 4 имени пользователя, есть

a?@!&ee
a?@!/&ee
as d
クイン

со ссылками как

<a href="/u/a%3f%40%21%26ee">a?@!&amp;ee</a><br>
<a href="/u/a%3f%40%21%2f%26ee">a?@!/&amp;ee</a><br>
<a href="/u/as%20d">as d</a><br>
<a href="/u/%ef%bd%b8%ef%bd%b2%ef%be%9d">クイン</a>

Последние две работы, но первые две я получаю исключение

A first chance exception of type 'System.ArgumentException' occurred in mscorlib.dll

Additional information: Illegal characters in path.

тогда

A first chance exception of type 'System.Web.HttpException' occurred in System.Web.dll

Additional information: '/u/a?@!&ee' is not a valid virtual path.

и на моей странице написано Bad Request. Как я могу позволить этим именам пользователей работать. Если это невозможно, как я могу написать обходной путь?

Ответы [ 2 ]

5 голосов
/ 04 февраля 2010

Тебе нужно снова сбежать. Используйте %252f вместо %2f. Чтобы уточнить, URL не закодирован, когда сервер получает его. Кодировка URL позволяет передавать /, который сервер обрабатывает как символ, вместо специальной функции, которую обычно вызывает зарезервированный символ. Для получения дополнительной информации см. Страницу Википедия .

Что касается вашей ошибки с именем пользователя a?@!&ee, то почти наверняка вы столкнулись с проблемой, с которой ASP.NET сталкивается со специальными символами (даже правильно закодированными), которых нет в строке запроса (то есть после ? часть URL). Джошуа Фланаган рассказывает об этом в своем блоге и определяет %, &, * и : как проблемных персонажей.

Он указывает на сообщение в блоге Dirk.Net , в котором предлагается пара исправлений. Во-первых, вы можете отредактировать реестр , чтобы разрешить использование ограниченных символов (добавив ключ DWORD AllowRestrictedChars в HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\HTTP\Parameters и установив для его логического значения значение true). Или вы можете убедиться, что у вас есть .NET framework 1.1 SP1 и отредактировать реестр, чтобы установить для ASP.NET VErification Compatibility значение true (DWORD HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ASP.NET VerificationCompatibility = 1). В-третьих, вы можете попробовать установить ValidateRequest в false на странице ASPX. Наконец, как решил Джошуа, вы можете передать информацию, используя строку запроса, т. Е. После ?, как первоначально ожидалось ASP.Net (до MVC).

0 голосов
/ 01 марта 2010

Я написал свое собственное решение. Приятно иметь имя пользователя с / но не учитывать как / при получении запроса GET.

...