mvc from current content c# asp.net asp.net-mvc razor

from - request url c# mvc



Cómo obtener la URL de la página actual en MVC 3 (8)

Agregue este método de extensión a su código:

public static Uri UrlOriginal(this HttpRequestBase request) { string hostHeader = request.Headers["host"]; return new Uri(string.Format("{0}://{1}{2}", request.Url.Scheme, hostHeader, request.RawUrl)); }

Y luego puede ejecutarlo desde la propiedad RequestContext.HttpContext.Request .

Hay un error (se puede hacer de lado, ver más abajo) en Asp.Net que surge en máquinas que usan puertos distintos al puerto 80 para el sitio web local (un gran problema si los sitios web internos se publican a través del equilibrio de carga en IP virtual) y los puertos se usan internamente para las reglas de publicación, por lo que Asp.Net siempre agregará el puerto en la propiedad AbsoluteUri , incluso si la solicitud original no lo usa.

Este código garantiza que la url devuelta sea siempre igual a la URL que solicitó originalmente el navegador (incluido el puerto, ya que se incluiría en el encabezado del host) antes de que tenga lugar el balanceo de carga, etc.

Al menos, lo hace en nuestro entorno (¡bastante complicado!) :)

Si hay algún proxy funky en medio que reescriba el encabezado del host, esto tampoco funcionará.

Actualización 30 de julio de 2013

Como mencionó @KevinJones en los comentarios a continuación, la configuración que menciono en la siguiente sección se ha documentado aquí: http://msdn.microsoft.com/en-us/library/hh975440.aspx

Aunque tengo que decir que no pude hacer que funcionara cuando lo probé, pero eso podría ser que yo haga un error tipográfico o algo así.

Actualización del 9 de julio de 2012

Me encontré con esto hace poco, y quería actualizar esta respuesta, pero nunca lo hice. Cuando llegó un voto a favor de esta respuesta, pensé que debía hacerlo ahora.

El ''error'' que menciono en Asp.Net se puede controlar con un valor de configuración de aplicaciones aparentemente no documentado, llamado ''aspnet:UseHostHeaderForRequest'' , es decir:

<appSettings> <add key="aspnet:UseHostHeaderForRequest" value="true" /> </appSettings>

Encontré esto mientras miraba HttpRequest.Url en ILSpy, indicado por ---> a la izquierda de la siguiente copia / pegado de esa vista de ILSpy:

public Uri Url { get { if (this._url == null && this._wr != null) { string text = this.QueryStringText; if (!string.IsNullOrEmpty(text)) { text = "?" + HttpEncoder.CollapsePercentUFromStringInternal(text, this.QueryStringEncoding); } ---> if (AppSettings.UseHostHeaderForRequestUrl) { string knownRequestHeader = this._wr.GetKnownRequestHeader(28); try { if (!string.IsNullOrEmpty(knownRequestHeader)) { this._url = new Uri(string.Concat(new string[] { this._wr.GetProtocol(), "://", knownRequestHeader, this.Path, text })); } } catch (UriFormatException) { } } if (this._url == null) { /* build from server name and port */ ...

Personalmente, no lo he usado, es indocumentado y, por lo tanto, no se garantiza que se quede, sin embargo, podría hacer lo mismo que mencioné anteriormente. Para aumentar la relevancia en los resultados de búsqueda, y para reconocer a otra persona que cree haberlo descubierto, la ''aspnet:UseHostHeaderForRequest'' también fue mencionada por Nick Aceves en Twitter

Estoy utilizando el complemento de comentarios de Facebook en un blog que estoy creando. Tiene algunas etiquetas FBXML que son interpretadas por el javascript de facebook al que se hace referencia en la página.

Todo esto funciona bien, pero tengo que pasar la URL actual y completa al complemento.

<div style="width: 900px; margin: auto;"> <div id="fb-root"></div> <fb:comments href="URL HERE" num_posts="10" width="900"></fb:comments> </div>

¿Cuál es la mejor manera de obtener la URL de la página actual? La URL de la solicitud.

Solución

Aquí está el código final de mi solución:

<fb:comments href="@Request.Url.AbsoluteUri" num_posts="15" width="900"></fb:comments>


Mi favorito...

Url.Content(Request.Url.PathAndQuery)

o solo...

Url.Action()


Para mí, el problema fue cuando intenté acceder a HTTPContext en el constructor del Controlador, mientras que HTTPContext aún no está listo. Cuando se movió dentro del método de índice funcionó:

var uri = new Uri(Request.Url.AbsoluteUri); url = uri.Scheme + "://" + uri.Host + "/";enter code here



Una cosa que no se menciona en otras respuestas es la distinción entre mayúsculas y minúsculas, si se va a hacer referencia en varios lugares (lo cual no se encuentra en la pregunta original, pero vale la pena tenerlo en cuenta, ya que esta pregunta aparece en muchas búsquedas similares). ). Basado en otras respuestas, inicialmente encontré que lo siguiente me funcionó:

Request.Url.AbsoluteUri.ToString()

Pero para ser más confiable esto se convirtió en:

Request.Url.AbsoluteUri.ToString().ToLower()

Y luego, para mis requisitos (verificando desde qué nombre de dominio se está accediendo al sitio y mostrando el contenido relevante):

Request.Url.AbsoluteUri.ToString().ToLower().Contains("xxxx")


Yo también estaba buscando esto por razones de Facebook y ninguna de las respuestas dadas funcionó según las necesidades o son demasiado complicadas.

@Request.Url.GetLeftPart(UriPartial.Path)

Obtiene el protocolo completo, el host y la ruta "sin" la cadena de consulta. También incluye el puerto si está usando un valor diferente al 80 predeterminado.


public static string GetCurrentWebsiteRoot() { return HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority); }


Request.Url.PathAndQuery

debería funcionar perfectamente, especialmente si solo quieres el Uri relativo (pero manteniendo las cadenas de consulta)