2009-04-23 2 views
7

В ASP.NET есть ли способ получить real необработанный URL?ASP.NET: Get * real * raw URL

Например, если пользователь просматривает «http://example.com/mypage.aspx/%2F», я хотел бы иметь возможность получить «http://example.com/mypage.aspx/%2F», а не «http://example.com/mypage.aspx//».

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

На данный момент я пытаюсь использовать uri в заголовке авторизации (который работает), но я не могу полагаться на то, что всегда было там.

EDIT:

То, что я действительно хочу сделать это, чтобы иметь возможность различать "http://example.com/mypage.aspx/%2F" и "http://example.com/mypage.aspx/%2F%2F".

Похоже, что ASP.NET сначала преобразует «% 2F% 2F» в «//», а затем преобразует косые черты в одну косую черту.

Так что просто перекодировка не будет работать.

ответ

6

следующий код работает для меня:

IServiceProvider serviceProvider = (IServiceProvider)HttpContext.Current; 
HttpWorkerRequest workerRequest = (HttpWorkerRequest)serviceProvider.GetService(typeof(HttpWorkerRequest)); 
string realUrl = workerRequest.GetServerVariable("HTTP_URL"); 

Обратите внимание, что это работает только при работе на IIS, а не под f.x. Сервер разработки ASP.NET!

спасибо Lucero за ответ в другой теме и Zhaph за то, что указал мне на нить.

+0

Это правильное решение. Он решает проблемы при кодировании в пути. HTTP_URL из переменных сервера отображает декодированную версию, и это решение обеспечивает правильную кодированную версию. –

+0

Это возвращает ожидаемый результат в IIS Express – Vivelin

1
Server.HtmlEncode(Request.RawUrl); 

Необработанный URL-адрес определяется как часть URL-адреса, следующего за информацией о домене. В строке URL http://www.contoso.com/articles/recent.aspx исходным URL-адресом является /articles/recent.aspx. Необработанный URL-адрес включает строку запроса, если она присутствует.

Смотри также: link text

+0

Любые URL-адреса в запросе потенциально уже очищены, Request.ServerVariables ["HTTP_URL"] является более точным. –

0

Ну, вы могли бы просто кодировать его обратно в URL-закодированные версии.

0

я не могу проверить здесь, но это может быть то, что вам нужно:

Request.Url.AbsoluteUri 
0

Получить URL из запроса и UrlEncode только строка запроса часть, а затем объединить их

1

Request.RawUrl вернется относительный путь приложения (включая информацию о querystring), в то время как Request.Url вернет полный путь (включая информацию о querystring).

Для получения дополнительной информации см. «Making sense of ASP.NET paths».

6

я не был в состоянии проверить это, потому что он работает только в IIS и не сервер разработки ASP.NET, который является частью Visual Studio, но попробуйте:

Request.ServerVariables [ «HTTP_URL»]

+0

Это возвращает ожидаемый результат для меня, хотя ему нужно комбинировать с HTTP_HOST и HTTP_QUERY, чтобы получить остальную часть URL-адреса. –

Смежные вопросы