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?


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.


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!


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.


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


1
Obrigado. Isso ajudou!
FlyingV 21/02/19


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

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 )


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.


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

1

Tente o seguinte -

var FullUrl = Request.Url.AbsolutePath.ToString();
var ID = FullUrl.Split('/').Last();
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.