¿Cómo obtengo la URL completa de la página en la que estoy en C #?

163

Necesito poder acceder a la URL completa de la página en la que estoy desde un control de usuario. ¿Es solo una cuestión de concatenar un conjunto de variables de solicitud juntas? ¿De ser asi, cuales? ¿O hay una manera más simple?

Lobos rojos
fuente
66
Para cualquier persona en una granja web con equilibrio de carga ... tenga cuidado con el número de puerto que aparece al usar System.Url: stackoverflow.com/questions/7674850/…
felickz

Respuestas:

155

Usualmente uso Request.Url.ToString()para obtener la url completa (incluida la cadena de consulta), no se requiere concatenación.

travis
fuente
2
Si la URL contiene '#', no se incluirán todos los caracteres después de #.
Krunal Sisodiya
55
@ KrunalSisodiya No creo que alguna vez se envíe el hash de una URL al servidor, pero podría estar equivocado.
travis
1
Request.Url.ToString()no incluye queryString.
Yogesh Patel
320

Aquí hay una lista a la que normalmente me refiero para este tipo de información:

Request.ApplicationPath :   /virtual_dir
Request.CurrentExecutionFilePath :  /virtual_dir/webapp/page.aspx
Request.FilePath :  /virtual_dir/webapp/page.aspx
Request.Path :  /virtual_dir/webapp/page.aspx
Request.PhysicalApplicationPath :   d:\Inetpub\wwwroot\virtual_dir\
Request.QueryString :   /virtual_dir/webapp/page.aspx?q=qvalue
Request.Url.AbsolutePath :  /virtual_dir/webapp/page.aspx
Request.Url.AbsoluteUri :   http://localhost:2000/virtual_dir/webapp/page.aspx?q=qvalue
Request.Url.Host :  localhost
Request.Url.Authority : localhost:80
Request.Url.LocalPath : /virtual_dir/webapp/page.aspx
Request.Url.PathAndQuery :  /virtual_dir/webapp/page.aspx?q=qvalue
Request.Url.Port :  80
Request.Url.Query : ?q=qvalue
Request.Url.Scheme :    http
Request.Url.Segments :  /
    virtual_dir/
    webapp/
    page.aspx

¡Espero que encuentres esto útil!

Mohsen
fuente
1
1) También hay Request.RawUrl; 2) Request.Url puede lanzar una excepción en 'rutas solicitadas muy malas'.
user2864740
Respuesta muy útil, pero ¿no deberían ser consistentes los números de puerto para evitar confusiones (suponiendo que todos los ejemplos son para la misma solicitud? Por ejemplo, Autoridad y Puerto implican el puerto 80 pero AbsoluteUri contiene el puerto 2000)
Young Bob
Request.QueryStringq=qvaluesolo regresa
Marcel
74
Request.Url.AbsoluteUri

Esta propiedad hace todo lo que necesita, todo en una llamada sucinta.

En desarrolloChris
fuente
66
+1. Esta es la mejor respuesta. Debería preferirse a Request.Url.ToString ().
Todd Menier
10

Porque ASP.NET Corenecesitarás explicarlo:

@($"{Context.Request.Scheme}://{Context.Request.Host}{Context.Request.Path}{Context.Request.QueryString}")

O puede agregar una declaración de uso a su vista:

@using Microsoft.AspNetCore.Http.Extensions

luego

@Context.Request.GetDisplayUrl()

El _ViewImports.cshtmlpodría ser un mejor lugar para eso@using

Serj Sagan
fuente
1
Gracias. Esto ayudó!
FlyingV
9

Request.RawUrl

FlySwat
fuente
77
Esto no devuelve la URL completa. Si la url completa es blah.com/1.1/home/main?a=1 Request.RawUrl devolverá 1.1 / hom / main? A = 1
jnoreiga
9

si necesita la URL completa como todo, desde el http hasta la cadena de consulta, deberá concatenar las siguientes variables

Request.ServerVariables("HTTPS") // to check if it's HTTP or HTTPS
Request.ServerVariables("SERVER_NAME") 
Request.ServerVariables("SCRIPT_NAME") 
Request.ServerVariables("QUERY_STRING")
Christian Hagelid
fuente
2
Esto no tiene en cuenta los puertos no estándar (es decir, no usar el puerto 80 para http)
Spongeboy
1
¡podría usar Request.ServerVariables ("SERVER_PORT") para la detección de puertos!
armen
1
Tenga en cuenta que esta respuesta usa la sintaxis VB.Net. En C #, use Request.ServerVariables ["HTTPS"] por ejemplo.
jaycer
7

Mejor de usar Request.Url.OriginalStringque Request.Url.ToString()(según MSDN )

Eni
fuente
Solo es mejor si realmente necesita la cadena original.
Dirk
@DirkThe desde el enlace a MSDN anterior: "La cadena devuelta por el método ToString puede contener caracteres de control, lo que puede dañar el estado de una aplicación de consola. Puede usar el método GetComponents con el formato UriFormat.SafeUnescaped para eliminar los caracteres de control de la cadena devuelta ".
Eni
Exactamente, y eso no tiene nada que ver OriginalString.
Dirk
5

Gracias chicos, utilicé una combinación de sus respuestas @Christian y @Jonathan para mi necesidad específica.

"http://" + Request.ServerVariables["SERVER_NAME"] +  Request.RawUrl.ToString()

No necesito preocuparme por http seguro, necesitaba la variable de nombre de servidor y RawUrl maneja la ruta desde el nombre de dominio e incluye la cadena de consulta si está presente.

Lobos rojos
fuente
2
También debe saber que RawUrl, a diferencia de Request.Url, representa la url de solicitud original sin asignar si se está utilizando la asignación de url.
harpo
SERVER_NAME a menudo no devuelve la URL "real" utilizada por el cliente. HTTP_HOST es probablemente la mejor forma si va a cavar directamente ... también se pierde HTTP-to-another-port simple.
user2864740
1

Si necesita el número de puerto también, puede usar

Request.Url.Authority

Ejemplo:

string url = Request.Url.Authority + HttpContext.Current.Request.RawUrl.ToString();

if (Request.ServerVariables["HTTPS"] == "on")
{
    url = "https://" + url;
}
else 
{
    url = "http://" + url;
}
IonB
fuente
1

Intenta lo siguiente:

var FullUrl = Request.Url.AbsolutePath.ToString();
var ID = FullUrl.Split('/').Last();
Abhishek Kanrar
fuente