Como obtenho o URL completo da página em que estou?

163

Eu preciso ser capaz de acessar a URL completa da página em que estou usando um controle de usuário. É apenas uma questão de concatenar várias variáveis ​​de solicitação juntas? Se sim, quais são? Ou existe uma maneira mais simples?

RedWolves
fonte
5
Para qualquer pessoa em uma webfarm loadbalanced .. cuidado com o número da porta que aparece quando se utiliza System.Url: stackoverflow.com/questions/7674850/...
felickz

Respostas:

155

Eu costumo usar Request.Url.ToString()para obter o URL completo (incluindo a string de consulta), sem necessidade de concatenação.

travis
fonte
2
Se o URL contiver '#', todos os caracteres após # não serão incluídos.
Krunal Sisodiya 01/09/16
5
@KrunalSisodiya Não acho que o hash de um URL seja enviado ao servidor, mas posso estar errado.
travis
Request.Url.ToString()não inclui include queryString.
Yogesh Patel
320

Aqui está uma lista à qual normalmente me refiro para esse tipo de informação:

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 você ache isso útil!

Mohsen
fonte
1
1) Há também Request.RawUrl; 2) Request.Url pode lançar uma exceção em 'caminhos solicitados muito ruins'.
user2864740
Muito útil resposta, mas não devem os números de porta ser consistente para evitar confusão (assumindo que todos os exemplos são para o mesmo pedido, por exemplo, Autoridade e Port implica a porta 80, mas absoluteURI contém porta 2000?)
Bob Young
Request.QueryStringretorna q=qvaluesomente
Marcel
74
Request.Url.AbsoluteUri

Esta propriedade faz tudo o que você precisa, tudo em uma ligação sucinta.

DevelopingChris
fonte
6
+1. Esta é a melhor resposta. Deve ter preferência sobre Request.Url.ToString ().
Todd Menier
10

Para ASP.NET Coreque você precisa explicitar:

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

Ou você pode adicionar uma instrução using à sua exibição:

@using Microsoft.AspNetCore.Http.Extensions

então

@Context.Request.GetDisplayUrl()

A _ViewImports.cshtmlpoderia ser um lugar melhor para isso@using

Serj Sagan
fonte
1
Obrigado. Isso ajudou!
FlyingV 21/02/19
9

Request.RawUrl

FlySwat
fonte
7
isso não retorna o URL completo. Se a URL completa é blah.com/1.1/home/main?a=1 Request.RawUrl retornará 1.1 / hom / main a = 1?
jnoreiga
9

se você precisar da URL completa, como tudo, do http à string de consulta, precisará concatenar as seguintes variáveis

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
fonte
2
Isso não leva em conta as portas não-padrão (ou seja, não usa a porta 80 para http) #
2115 Spongeboy
1
você pode usar Request.ServerVariables ("SERVER_PORT") para detecção de porta!
Armen #
1
Observe que esta resposta usa a sintaxe do VB.Net. Em C #, use Request.ServerVariables ["HTTPS"] por exemplo.
jaycer
7

Melhor usar do Request.Url.OriginalStringque Request.Url.ToString()(de acordo com o MSDN )

Eni
fonte
Só é melhor se você realmente precisar da string original.
Dirk
@DirkThe from link to MSDN acima: "A string retornada pelo método ToString pode conter caracteres de controle, que podem corromper o estado de um aplicativo de console. Você pode usar o método GetComponents com o formato UriFormat.SafeUnescaped para remover caracteres de controle da string retornada. . "
Eni
Exatamente, e isso não tem nada a ver OriginalString.
Dirk
5

Obrigado pessoal, usei uma combinação das duas respostas @Christian e @Jonathan para minha necessidade específica.

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

Não preciso me preocupar com http seguro, precisava da variável servername e o RawUrl lida com o caminho do nome do domínio e inclui a querystring, se presente.

RedWolves
fonte
2
Você também deve saber que RawUrl, diferentemente de Request.Url, representa o URL de solicitação original não mapeado se o mapeamento de URL estiver sendo usado.
harpo 9/09/08
SERVER_NAME geralmente não retorna o URL "real" usado pelo cliente. HTTP_HOST é provavelmente a melhor forma se você se interessar diretamente. Também perde HTTP simples para outra porta.
user2864740
1

Se você também precisar do número da porta, poderá usar

Request.Url.Authority

Exemplo:

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

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

Tente o seguinte -

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