Come visualizzare l'URL corrente in asp.net core 1.0


Risposte:


122

Devi ottenere l'host e il percorso separatamente.

 @Context.Request.Host@Context.Request.Path

14
Questo non riporterà l'URL corretto se l'app si trova in una directory virtuale. Sarà necessario anteporre il Request.Path valore con il Request.PathBase valore se ce n'è uno. Questo vale anche per quasi tutte le altre risposte a questa domanda.
padigan

Cos'è questo @tra le due corde? potresti spiegarlo?
Mohammed Noureldin

3
@ MohammedNoureldin: questa è la sintassi della vista rasoio.
jack.pop

2
Per le pagine del rasoio ho dovuto usare al @HttpContextposto di @Context. Per le viste parziali @Contextfunziona. Ho dimenticato un utilizzo?
Andriod

2
C'è un modo semplice in MVC Url.Action("Action", null, null, Request.Url.Scheme); stackoverflow.com/questions/434604/…
Dan

110

Hai bisogno di schema, host, percorso e queryString

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

o utilizzando la nuova funzionalità C # 6 "Interpolazione di stringhe"

@($"{Context.Request.Scheme}://{Context.Request.Host}{Context.Request.Path}{Context.Request.QueryString}")

1
Come si ottiene il frammento, ad esempio test.com/abc#123 , come si ottiene il frammento # 123 dalla richiesta?
Ray

4
@fanray Non puoi. I browser non inviano frammenti URI al server
tmg

Prendi in considerazione l'utilizzo di UriBuilder per creare URL.
Erik Philips

84

Puoi utilizzare il metodo di estensione di Request:

Request.GetDisplayUrl()

33
Funziona se aggiungi @using Microsoft.AspNetCore.Http.Extensionspoi@Context.Request.GetDisplayUrl()
Serj Sagan,

2
ricevo

1
Tieni presente che il riepilogo intellisense per questa funzione dice Suitable only for display. This format should not be used in HTTP headers or other HTTP operations.Basandomi su questo, penso che la soluzione di @ tmg sia la migliore (forse racchiusa nel tuo metodo di estensione).
Gordon Glas

16

Apparentemente questo era sempre possibile in .net core 1.0 con Microsoft.AspNetCore.Http.Extensions, che aggiunge l'estensione HttpRequestper ottenere l'URL completo; GetEncodedUrl .

ad es. dalla vista rasoio:

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

Dalla 2.0, hanno anche percorso relativo e query GetEncodedPathAndQuery .


15

Usa la proprietà AbsoluteUri di Uri, con .Net core devi creare Uri da una richiesta come questa,

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

 var url = location.AbsoluteUri;

ad esempio, se l'URL della richiesta è " http://www.contoso.com/catalog/shownew.htm?date=today ", verrà restituito lo stesso URL.


8
Cose come questa mi fanno pensare che .Net Core sia un passo indietro in qualche modo. È meglio di Request.Url in Asp.Net in un modo che non riesco a immaginare?
Soenhay

8

Puoi considerare di utilizzare questo metodo di estensione (dallo Microsoft.AspNetCore.Http.Extensionsspazio dei nomi:

@Context.Request.GetDisplayUrl()

Per alcuni miei progetti preferisco soluzioni più flessibili. Esistono due metodi di estensione.

1) Il primo metodo crea l' Urioggetto dai dati della richiesta in arrivo (con alcune varianti tramite parametri opzionali). 2) Il secondo metodo riceve l' Urioggetto e restituisce stringnel seguente formato (senza barra finale): 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);
    }

Utilizzo:

//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

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

ma dove stai andando httpContext? Non funzionerà con Microsoft.AspNetCore.Http.HttpContext.Request
Tom Stickel

7

Se stai cercando di ottenere anche il numero di porta dalla richiesta, dovrai accedervi tramite la Request.Hostproprietà per AspNet Core.

La Request.Hostproprietà non è semplicemente una stringa ma, invece, un oggetto che contiene sia il dominio host che il numero di porta. Se il numero di porta è specificamente scritto fuori nella URL (es "https://example.com:8080/path/to/resource"), quindi chiamando Request.Hostvi darà il dominio host e il numero di porta in questo modo: "example.com:8080".

Se si desidera solo il valore per il dominio host o si desidera solo il valore per il numero di porta, è possibile accedere a tali proprietà singolarmente (ad esempio Request.Host.Hosto Request.Host.Port).


6

La risposta accettata mi ha aiutato, così come il commento di @padigan, ma se vuoi includere i parametri della stringa di query come è stato per me, prova questo:

@Context.Request.PathBase@Context.Request.GetEncodedPathAndQuery()

E sarà necessario aggiungere @using Microsoft.AspNetCore.Http.Extensionsnella vista affinché il metodo GetEncodedPathAndQuery () sia disponibile.


1

Esiste un modo semplice per ottenere l'URL corrente da una pagina Razor o da una classe PageModel. Questo è:

Url.PageLink()

Si noti che intendevo "ASP.NET Core Razor Pages ", non MVC.

Uso questo metodo quando voglio stampare il meta tag dell'URL canonico nelle pagine Razor di ASP.NET Core. Ma c'è un problema. Ti darà l'URL che dovrebbe essere l'URL giusto per quella pagina. Lasciatemi spiegare.

Supponiamo che tu abbia definito una rotta denominata "id" per la tua pagina e quindi il tuo URL dovrebbe apparire come

http://example.com/product?id=34

Url.PageLink () ti darà esattamente quell'URL come mostrato sopra.

Ora, se l'utente aggiunge qualcosa in più a quell'URL, ad esempio,

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

Quindi, non otterrai quel "somethingElse" da questo metodo. Ed è per questo che è esattamente buono per la stampa di meta tag URL canonici nella pagina HTML.

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.