¿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?


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.


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!


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.


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


1
Gracias. Esto ayudó!
FlyingV


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")

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 )


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.


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;
}

1

Intenta lo siguiente:

var FullUrl = Request.Url.AbsolutePath.ToString();
var ID = FullUrl.Split('/').Last();
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.