Ottieni URL non elaborato da Microsoft.AspNet.Http.HttpRequest


89

La HttpRequestclasse in Asp.Net 5 (vNext) contiene (tra le altre cose) dettagli analizzati circa l'URL per la richiesta, come ad esempio Scheme, Host, Pathetc.

Tuttavia, non ho ancora individuato da nessuna parte che esponga l'URL della richiesta originale, solo questi valori analizzati. (Nelle versioni precedenti c'era Request.Uri)

Posso recuperare l'URL grezzo senza doverlo ricostruire dai componenti disponibili su HttpRequest?


1
Un bug sembra essere stato segnalato in precedenza su questo ma è stato chiuso ... probabilmente puoi controllarne i dettagli e se ti senti più forte al riguardo, potresti aggiornarlo con i dettagli: github.com/aspnet/HttpAbstractions/issues/110
Kiran Challa

@KiranChalla: Prendo in qualche modo il loro punto di vista, anche se mi chiedo cosa sia RawURL nelle versioni precedenti di allora. Immagino che ciò che stanno attualmente mostrando sullo schema, l'host ecc. Possa essere intuito dalla gestione della richiesta lato server e non da nulla sulla richiesta stessa.
Jon Egerton

hai provato ToString ()?
agua dal

Risposte:


85

Sembra che tu non possa accedervi direttamente, ma puoi crearlo usando il framework:

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

Puoi anche usare quanto sopra come metodo di estensione.

Questo restituisce a stringanziché a Uri, ma dovrebbe servire allo scopo! (Anche questo sembra svolgere il ruolo di UriBuilder, anche.)

Grazie a @mswietlicki per aver sottolineato che è stato appena refactoring anziché mancare! E anche a @CF per sottolineare il cambiamento dello spazio dei nomi nella mia risposta!


4
Non funziona più a partire dalla beta-5. Non ho una buona alternativa o aggiornerei la mia risposta.
Matt DeKrey

13
Credo che questo sia stato reso un vero metodo di estensione: devi semplicemente importare lo spazio dei nomi e chiamare GetEncodedUrio GetDisplayUri, a seconda del tuo caso d'uso.
dlras2

43
utilizzando Microsoft.AspNet.Http.Extensions; e quella Request.GetDisplayUrl ()
mswietlicki

8
Lo spazio dei nomi corretto è ora Microsoft.AspNetCore.Http.Extensions
CF

9
Per ASP.NET Core 1.0, aggiungere "Microsoft.AspNetCore.Http.Extensions" alla visualizzazione Razor. Per ottenere l'URL utilizzare "@ Context.Request.GetDisplayUrl ()".
Joop

75

Aggiungi il pacchetto Nuget / usando:

using Microsoft.AspNetCore.Http.Extensions; 

(In ASP.NET Core RC1 questo era in Microsoft.AspNet.Http.Extensions)

quindi puoi ottenere l'URL completo della richiesta http eseguendo:

var url = httpContext.Request.GetEncodedUrl();

o

var url = httpContext.Request.GetDisplayUrl();

a seconda degli scopi.


ASP.NET Core RC2 è ora disponibile?
Sergey G.


Guardando la fonte, questi chiaramente fanno un po 'di codifica / decodifica, quindi questo non sarà l'URL grezzo. Inoltre, IIS a volte cambierà l'URL prima che arrivi a Kestrel, ad esempio% 2F -> /.
Daniel Leach

1
@ TomStickel Non sono sicuro di cosa stai parlando ... Non ho avuto problemi a usare nessuno dei due. Assicurati di avere la usingdirettiva nel tuo file come descritto nella risposta, poiché questi non sono metodi "normali", ma piuttosto metodi di estensione.
Nick Mertin

1
@ TomStickel fair. Solo notando che con il pacchetto Microsoft.AspNetCore.All installato per ASP.NET Core 2.2 (testato anche su 2.0), questo funziona bene per me.
Nick Mertin

16

Se vuoi davvero l' URL reale e non elaborato , puoi utilizzare il seguente metodo di estensione:

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

Questo metodo utilizza la RawTargetparte della richiesta, che non viene visualizzata HttpRequestsull'oggetto stesso. Questa proprietà è stata aggiunta nella versione 1.0.0 di ASP.NET Core. Assicurati di eseguire quella o una versione più recente.

NOTA! Questa proprietà espone l' URL grezzo , quindi non è stato decodificato, come notato dalla documentazione:

Questa proprietà non viene utilizzata internamente per le decisioni di instradamento o autorizzazione. Non è stato UrlDecoded e occorre prestare attenzione nel suo utilizzo.


Sto usando ASP .NET Core con .NET Framework completo. Questo non sembra funzionare per me ( RawTargetnon è definito IHttpRequestFeature). Riesci a pensare a un'alternativa?
Tomáš Hübelbauer

1
RawTargetè stato aggiunto nella versione 1.0, a maggio . Sei sicuro di utilizzare l'ultima versione?
khellang

1
Se l'hosting utilizza IIS, IIS a volte cambierà l'URL prima che arrivi a Kestrel. Un esempio è che% 2F viene decodificato in /.
Daniel Leach

Questa è di gran lunga la risposta autorevole.
Chris Marisic

Questo sembra fornire il percorso dell'URL piuttosto che l'intero URL
Iain Ballard,

12

In .NET Core razor:

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

Puoi anche usare al posto della seconda riga:

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

9

Le altre soluzioni non si adattavano bene alle mie esigenze perché volevo direttamente un URIoggetto e penso sia meglio evitare la concatenazione di stringhe (anche) in questo caso quindi ho creato questo metodo di estensione piuttosto che usare a UriBuildere funziona anche con URL come 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
Bene. Inoltre ho migliorato la tua soluzione con parametri opzionali. Quindi posso controllare quale parte dell'URI voglio recuperare. Ad esempio, solo host o percorso completo senza stringa di query ecc.
user3172616

@ user3172616 bella idea!
giammin

1
(80)dovrebbe essere (-1). Quando hai uno schema https con la porta omessa nell'intestazione "Host", questo genererà Uri errato (ad esempio https://myweb:80/, con (-1)esso sarà https://myweb).
Igor Dražić

4

Il seguente metodo di estensione riproduce la logica della pre-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

Questa estensione funziona per me:

using 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

In ASP.NET 5 beta5:

Microsoft.AspNet.Http.Extensions.UriHelper.Encode(
    request.Scheme, request.Host, request.PathBase, request.Path, request.QueryString);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.