Como obter url atual em exibição no asp.net core 1.0

Respostas:

121

Você deve obter o host e o caminho separadamente.

 @[email protected]
Clint B
fonte
14
Isso não relatará o url correto se seu aplicativo estiver em um diretório virtual. Você precisará prefixar o valor Request.Path com o valor Request.PathBase, se houver. Isso se aplica a quase todas as outras respostas a essa pergunta também.
padigan de
O que é isso @entre as duas cordas? você poderia explicar isso?
Mohammed Noureldin
3
@MohammedNoureldin: essa é a sintaxe da visão de navalha.
jack.pop
2
Para páginas de navalha, tive que usar em @HttpContextvez de @Context. Para @Contextobras de vistas parciais . Eu esqueci de usar?
Andriod
2
Há uma maneira fácil em MVC Url.Action("Action", null, null, Request.Url.Scheme); stackoverflow.com/questions/434604/…
Dan,
110

Você precisa de esquema, host, caminho e queryString

@string.Format("{0}://{1}{2}{3}", Context.Request.Scheme, Context.Request.Host, Context.Request.Path, Context.Request.QueryString)

ou usando o novo recurso C # 6 "interpolação de string"

@($"{Context.Request.Scheme}://{Context.Request.Host}{Context.Request.Path}{Context.Request.QueryString}")
tmg
fonte
1
Como você obtém o fragmento, digamos test.com/abc#123 , como você obtém o fragmento # 123 da solicitação?
Ray,
4
@fanray Você não pode. Os navegadores não estão enviando fragmentos de URI para o servidor
tmg
Considere usar UriBuilder para construir urls.
Erik Philips
84

Você pode usar o método de extensão de Request:

Request.GetDisplayUrl()
AlexBar
fonte
33
Isso funciona se você adicionar @using Microsoft.AspNetCore.Http.Extensionsentão@Context.Request.GetDisplayUrl()
Serj Sagan
2
ainda recebendo - A solicitação não existe no contexto atual
SeanMC
1
Tenha em mente que o resumo da intellisense para esta função diz: Suitable only for display. This format should not be used in HTTP headers or other HTTP operations.Baseado nisso, acho que a solução do @tmg é a melhor (talvez envolvida em seu próprio método de extensão).
Gordon Glas
16

Isso aparentemente sempre foi possível em .net core 1.0 com Microsoft.AspNetCore.Http.Extensions, que adiciona a extensão a HttpRequestpara obter o URL completo; GetEncodedUrl .

por exemplo, da visão de navalha:

@using Microsoft.AspNetCore.Http.Extensions
...
<a href="@Context.Request.GetEncodedUrl()">Link to myself</a>

Desde 2.0, também tem caminho relativo e consulta GetEncodedPathAndQuery .

mcNux
fonte
15

Use a propriedade AbsoluteUri do Uri, com .Net core você tem que construir o Uri a partir de um pedido como este,

 var location = new Uri($"{Request.Scheme}://{Request.Host}{Request.Path}{Request.QueryString}");

 var url = location.AbsoluteUri;

por exemplo, se o url do pedido for ' http://www.contoso.com/catalog/shownew.htm?date=today ', ele retornará o mesmo url.

Dhanuka777
fonte
8
Coisas como essa me fazem pensar que .Net Core é um retrocesso em alguns aspectos. Isso é melhor do que Request.Url no Asp.Net de alguma forma que não consigo imaginar?
Soenhay de
8

Você pode considerar o uso deste método de extensão (do Microsoft.AspNetCore.Http.Extensionsnamespace:

@Context.Request.GetDisplayUrl()

Para alguns meus projetos, prefiro uma solução mais flexível. Existem dois métodos de extensão.

1) O primeiro método cria Uriobjeto a partir de dados de solicitação de entrada (com algumas variantes por meio de parâmetros opcionais). 2) O segundo método recebe o Uriobjeto e retorna stringno seguinte formato (sem barra final): Scheme_Host_Port

public static Uri GetUri(this HttpRequest request, bool addPath = true, bool addQuery = true)
    {
        var uriBuilder = new UriBuilder
        {
            Scheme = request.Scheme,
            Host = request.Host.Host,
            Port = request.Host.Port.GetValueOrDefault(80),
            Path = addPath ? request.Path.ToString() : default(string),
            Query = addQuery ? request.QueryString.ToString() : default(string)
        };
        return uriBuilder.Uri;
    }

    public static string HostWithNoSlash(this Uri uri)
    {
        return uri.GetComponents(UriComponents.SchemeAndServer, UriFormat.UriEscaped);
    }

Uso:

//before >> https://localhost:44304/information/about?param1=a&param2=b
        Request.GetUri(addQuery: false);
        //after >> https://localhost:44304/information/about

        //before >> https://localhost:44304/information/about?param1=a&param2=b
        new Uri("https://localhost:44304/information/about?param1=a&param2=b").GetHostWithNoSlash();
        //after >> https://localhost:44304
user3172616
fonte
7
public string BuildAbsolute(PathString path, QueryString query = default(QueryString), FragmentString fragment = default(FragmentString))
{
    var rq = httpContext.Request;
    return Microsoft.AspNetCore.Http.Extensions.UriHelper.BuildAbsolute(rq.Scheme, rq.Host, rq.PathBase, path, query, fragment);
}
Sergey
fonte
mas onde você está conseguindo httpContext? Isso não vai funcionar com Microsoft.AspNetCore.Http.HttpContext.Request
Tom Stickel
7

Se você deseja obter o número da porta da solicitação, será necessário acessá-lo por meio doRequest.Host propriedade do AspNet Core.

A Request.Hostpropriedade não é simplesmente uma string, mas, em vez disso, um objeto que contém o domínio do host e o número da porta. Se o número da porta é especificamente escrito para fora na URL (ou seja "https://example.com:8080/path/to/resource"), em seguida, chamar Request.Hostlhe dará o domínio do host eo número da porta da seguinte forma: "example.com:8080".

Se você quiser apenas o valor para o domínio do host ou apenas o valor para o número da porta, poderá acessar essas propriedades individualmente ( Request.Host.Hostou seja, ou Request.Host.Port).

Hallmanac
fonte
6

A resposta aceita me ajudou, assim como o comentário de @padigan, mas se você quiser incluir os parâmetros de string de consulta como era o meu caso, tente isto:

@[email protected]()

E você precisará adicionar @using Microsoft.AspNetCore.Http.Extensionsa visualização para que o método GetEncodedPathAndQuery () esteja disponível.

Christopher King
fonte
1

Existe uma maneira limpa de obter o URL atual de uma página do Razor ou classe PageModel. Isso é:

Url.PageLink()

Observe que eu quis dizer as "Páginas ASP.NET Core Razor", não o MVC.

Eu uso esse método quando desejo imprimir a metatag canônica de URL nas páginas do ASP.NET Core. Mas há um porém. Ele lhe dará a URL que deve ser a URL certa para aquela página. Deixe-me explicar.

Digamos que, de acordo com a rota que você definiu para uma página, seu URL deve ser semelhante a

http://www.minhaWebsite.com/produto?id=34

Digamos que você definiu uma rota "Id" para sua página. Portanto, Url.PageLink () fornecerá exatamente esse URL. Se o usuário adicionar algo extra nesse URL, digamos,

http://www.myWebsite.com/product?id=34&somethingElse

Então, você não obterá aquele "somethingElse" com este método. E é por isso que ele é exatamente bom para imprimir metatags de URL canônicas na página HTML.

Emran Hussain
fonte