Obtenha o URL bruto de Microsoft.AspNet.Http.HttpRequest


87

A HttpRequestclasse em Asp.Net 5 (vNext) contém (entre outras coisas) detalhes analisados sobre o URL para o pedido, como Scheme, Host, Pathetc.

Ainda não localizei nenhum lugar que exponha o URL da solicitação original - apenas esses valores analisados. (Nas versões anteriores havia Request.Uri)

Posso obter o URL bruto de volta sem precisar reuni-lo dos componentes disponíveis em HttpRequest?


1
Um bug parece ter sido registrado anteriormente sobre isso, mas encerrado ... você provavelmente pode verificar os detalhes dele e se você se sentir mais firme
Kiran Challa

@KiranChalla: Eu meio que entendo o que eles querem dizer, embora isso me leve a imaginar o que era RawURL nas versões anteriores. Eu acho que o que eles estão mostrando atualmente sobre o esquema, host, etc, pode ser adivinhado pelo tratamento da solicitação no lado do servidor, e não por nada na solicitação em si.
Jon Egerton

você tentou ToString ()?
água de março

Respostas:


82

Parece que você não pode acessá-lo diretamente, mas pode criá-lo usando a estrutura:

Microsoft.AspNetCore.Http.Extensions.UriHelper.GetFullUrl(Request)

Você também pode usar o acima como um método de extensão.

Isso retorna um em stringvez de um Uri, mas deve servir ao propósito! (Isso também parece servir ao papel do UriBuildertambém.)

Obrigado a @mswietlicki por apontar que ele acabou de ser refatorado em vez de sumir! E também para @CF, para apontar a mudança de namespace em minha resposta!


4
Isso não funciona mais a partir do beta-5. Não tenho uma boa alternativa ou atualizaria minha resposta.
Matt DeKrey

13
Eu acredito que isso se tornou um verdadeiro método de extensão - você simplesmente importa o namespace e chama GetEncodedUriou GetDisplayUri, dependendo do seu caso de uso.
dlras2,

42
usando Microsoft.AspNet.Http.Extensions; e que Request.GetDisplayUrl ()
mswietlicki

8
O namespace certo agora é Microsoft.AspNetCore.Http.Extensions
CF

9
Para ASP.NET Core 1.0, adicione "Microsoft.AspNetCore.Http.Extensions" à visualização do Razor. Para obter o url, use "@ Context.Request.GetDisplayUrl ()".
Joop

75

Adicione o pacote Nuget / usando:

using Microsoft.AspNetCore.Http.Extensions; 

(No ASP.NET Core RC1, isso estava em Microsoft.AspNet.Http.Extensions)

então você pode obter o URL completo da solicitação http executando:

var url = httpContext.Request.GetEncodedUrl();

ou

var url = httpContext.Request.GetDisplayUrl();

dependendo dos objetivos.


O ASP.NET Core RC2 está disponível agora?
Sergey G.


Olhando para a fonte, eles claramente codificam / decodificam, então este não será o url bruto. Além disso, o IIS às vezes muda, mudando o url antes de chegar ao Kestrel, por exemplo% 2F -> /.
Daniel Leach

1
@TomStickel Não tenho certeza do que você está falando ... Não tive problemas para usar nenhum deles. Certifique-se de ter a usingdiretiva em seu arquivo conforme descrito na resposta, pois esses não são métodos "normais", mas sim métodos de extensão.
Nick Mertin

1
Feira @TomStickel. Apenas observando que com o pacote Microsoft.AspNetCore.All instalado para ASP.NET Core 2.2 (também testado no 2.0), isso funciona bem para mim.
Nick Mertin de

16

Se você realmente deseja o URL bruto real, pode usar o seguinte método de extensão:

public static class HttpRequestExtensions
{
    public static Uri GetRawUrl(this HttpRequest request)
    {
        var httpContext = request.HttpContext;

        var requestFeature = httpContext.Features.Get<IHttpRequestFeature>();

        return new Uri(requestFeature.RawTarget);
    }
}

Este método utiliza o RawTargetda solicitação, que não aparece no HttpRequestpróprio objeto. Esta propriedade foi adicionada na versão 1.0.0 do ASP.NET Core. Certifique-se de que está executando essa ou uma versão mais recente.

NOTA! Esta propriedade expõe o URL bruto , portanto, não foi decodificado, conforme observado pela documentação:

Esta propriedade não é usada internamente para decisões de roteamento ou autorização. Não foi urlDecoded e deve-se ter cuidado ao usá-lo.


Estou usando ASP .NET Core com .NET Framework completo. Isso não parece funcionar para mim ( RawTargetnão está definido em IHttpRequestFeature). Você pode pensar em uma alternativa?
Tomáš Hübelbauer

1
RawTargetfoi adicionado na versão 1.0, em maio . Tem certeza de que está executando a versão mais recente?
khellang

1
Se estiver hospedando usando IIS, o IIS às vezes muda, mudando a url antes de chegar ao Kestrel. Um exemplo disso é que% 2F é decodificado para /.
Daniel Leach

Esta é de longe a resposta confiável.
Chris Marisic

Isso parece fornecer o caminho do URL em vez de todo o URL
Iain Ballard

10

No razor do .NET Core:

@using Microsoft.AspNetCore.Http.Extensions
@Context.Request.GetEncodedUrl() //Use for any purpose (encoded for safe automation)

Você também pode usar em vez da segunda linha:

@Context.Request.GetDisplayUrl() //Use to display the URL only

8

As outras soluções não atenderam bem às minhas necessidades porque eu queria diretamente um URIobjeto e acho melhor evitar a concatenação de strings (também) neste caso, então criei esses métodos de extensão do que usar um UriBuildere também funciona com urls como http://localhost:2050:

public static Uri GetUri(this HttpRequest request)
{
    var uriBuilder = new UriBuilder
    {
        Scheme = request.Scheme,
        Host = request.Host.Host,
        Port = request.Host.Port.GetValueOrDefault(80),
        Path = request.Path.ToString(),
        Query = request.QueryString.ToString()
    };
    return uriBuilder.Uri;
}

1
Um bom. Também melhorei sua solução com parâmetros opcionais. Portanto, posso controlar qual parte do URI desejo recuperar. Por exemplo, somente host ou caminho completo sem string de consulta etc.
user3172616

@ user3172616 boa ideia!
giammin

1
(80)deveria ser (-1). Quando você tem o esquema https com a porta omitida no cabeçalho "Host", isso irá gerar um Uri errado (por exemplo https://myweb:80/, com (-1)ele será https://myweb).
Igor Dražić

4

O seguinte método de extensão reproduz a lógica do pré-beta5 UriHelper:

public static string RawUrl(this HttpRequest request) {
    if (string.IsNullOrEmpty(request.Scheme)) {
        throw new InvalidOperationException("Missing Scheme");
    }
    if (!request.Host.HasValue) {
        throw new InvalidOperationException("Missing Host");
    }
    string path = (request.PathBase.HasValue || request.Path.HasValue) ? (request.PathBase + request.Path).ToString() : "/";
    return request.Scheme + "://" + request.Host + path + request.QueryString;
}

3

Esta extensão funciona para mim:

usando Microsoft.AspNetCore.Http;

    public static class HttpRequestExtensions
    {
        public static string GetRawUrl(this HttpRequest request)
        {
            var httpContext = request.HttpContext;
            return $"{httpContext.Request.Scheme}://{httpContext.Request.Host}{httpContext.Request.Path}{httpContext.Request.QueryString}";
        }
    }

0

No ASP.NET 5 beta5:

Microsoft.AspNet.Http.Extensions.UriHelper.Encode(
    request.Scheme, request.Host, request.PathBase, request.Path, request.QueryString);
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.