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.