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 puedes ejecutarlo desde RequestContext.HttpContext.Request
propiedad.
Hay un error (se puede evitar, ver a continuación) en Asp.Net que surge en máquinas que usan puertos que no son el 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 publicar reglas) por lo que Asp.Net siempre agregará el puerto en elAbsoluteUri
propiedad, incluso si la solicitud original no lo usa.
Este código garantiza que la url devuelta siempre sea igual a la url que el navegador solicitó originalmente (incluido el puerto, ya que se incluiría en el encabezado del host) antes de que tenga lugar un equilibrio de carga, etc.
Al menos, lo hace en nuestro entorno (¡bastante complicado!) :)
Si hay algún proxy funky en el medio que reescriba el encabezado del host, entonces 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 hacerlo funcionar cuando lo probé, pero eso podría ser solo yo haciendo un error tipográfico o algo así.
Actualización 9 de julio de 2012
Me encontré con esto hace un momento, y tenía la intención de actualizar esta respuesta, pero nunca lo hice. Cuando llegó un voto positivo sobre esta respuesta, pensé que debería hacerlo ahora.
El 'error' que menciono en Asp.Net se puede controlar con un valor de configuración de aplicación aparentemente indocumentado, llamado 'aspnet:UseHostHeaderForRequest'
, es decir:
<appSettings>
<add key="aspnet:UseHostHeaderForRequest" value="true" />
</appSettings>
Me encontré con esto mientras miraba HttpRequest.Url
en ILSpy, indicado por --->
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 alguien más que parece haber descubierto esto, Nick Aceves también ha mencionado la 'aspnet:UseHostHeaderForRequest'
configuración en Twitter.