2009-04-23 14 views
7

En ASP.NET, ¿hay alguna manera de obtener la URL real sin procesar?ASP.NET: Obtenga * real * URL sin procesar

Por ejemplo, si un usuario busca "http://example.com/mypage.aspx/%2F", me gustaría poder obtener "http://example.com/mypage.aspx/%2F" en lugar de "http://example.com/mypage.aspx//".

Por supuesto, me gustaría tener una forma clara de hacerlo, pero puedo vivir con un enfoque hacky utilizando la reflexión o el acceso a propiedades oscuras.

Por el momento, trato de usar el uri en el encabezado Authorization (que funciona), pero no puedo confiar en que siempre esté ahí.

EDIT:

Lo que realmente quiero hacer es ser capaz de distinguir entre "http://example.com/mypage.aspx/%2F" y "http://example.com/mypage.aspx/%2F%2F".

Parece que ASP.NET primero convierte "% 2F% 2F" en "//" y luego convierte las barras en una sola barra.

Así que solo volver a codificarlo no va a funcionar.

Respuesta

6

El siguiente código funciona para mí:

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

Tenga en cuenta que esto solo funciona cuando se ejecuta en IIS y no en f.x. ¡Servidor de desarrollo ASP.NET!

Gracias a Lucero por la respuesta en otro hilo y Zhaph por señalarme el hilo.

+0

Esta es la solución correcta. Soluciona problemas cuando hay codificación en la ruta. El HTTP_URL de las variables del servidor mostrará la versión decodificada y esta solución proporciona la versión codificada correcta. –

+0

Esto devuelve el resultado esperado también bajo IIS Express – Vivelin

1
Server.HtmlEncode(Request.RawUrl); 

La URL sin procesar se define como la parte de la URL que sigue a la información del dominio. En la cadena de URL http://www.contoso.com/articles/recent.aspx, la URL sin formato es /articles/recent.aspx. La URL sin formato incluye la cadena de consulta, si está presente.

ver también: link text

+0

Cualquier URL en Solicitud ya está potencialmente limpia, Request.ServerVariables ["HTTP_URL"] es más preciso. –

0

Bueno, usted podría codificar de nuevo a la versión con codificación URL.

0

No puedo aquí el test, pero esto podría ser lo que necesita:

Request.Url.AbsoluteUri 
0

obtener la URL de la petición y urlencode sólo la parte de la cadena de consulta y luego concatenar

1

Request.RawUrl volverá la ruta relativa de la aplicación (incluida la información de la cadena de consulta) mientras Request.Url devolverá la ruta completa (incluida la información de la cadena de consulta).

Para obtener más información, consulte "Making sense of ASP.NET paths".

6

yo no era capaz de probar esto, ya que sólo funciona en IIS y no el servidor de desarrollo ASP.NET que es parte de Visual Studio, pero trate:

Request.ServerVariables [ "HTTP_URL"]

+0

Esto devuelve el resultado esperado para mí, aunque necesita combinarse con HTTP_HOST y HTTP_QUERY para obtener el resto de la URL. –

Cuestiones relacionadas