Come ottenere l'URL completo della pagina in cui mi trovo in C #


163

Devo essere in grado di ottenere l'URL completo della pagina in cui mi trovo da un controllo utente. Si tratta solo di concatenare insieme un mucchio di variabili Request? Se sì, quali? O c'è un modo più semplice?


5
Per chiunque in una webfarm load balancing .. guardatevi il numero di porta che viene visualizzato quando si utilizza System.Url: stackoverflow.com/questions/7674850/...
felickz

Risposte:


155

Di solito lo uso Request.Url.ToString()per ottenere l'URL completo (inclusa la querystring), non è richiesta alcuna concatenazione.


2
Se l'URL contiene '#', non verrà incluso tutto il carattere dopo #.
Krunal Sisodiya,

5
@KrunalSisodiya Non penso che l'hash dell'URL venga mai inviata al server, ma potrei sbagliarmi.
travis

Request.Url.ToString()non è incluso queryString.
Yogesh Patel,

320

Ecco un elenco a cui mi riferisco normalmente per questo tipo di informazioni:

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

Spero che lo troverai utile!


1
1) C'è anche Request.RawUrl; 2) Request.Url può generare un'eccezione su "percorsi richiesti molto male".
user2864740

Risposta molto utile, ma i numeri di porta non dovrebbero essere coerenti per evitare confusione (supponendo che tutti gli esempi siano per la stessa richiesta? Ad esempio, Autorità e Porta implicano la porta 80 ma AbsoluteUri contiene la porta 2000)
Young Bob

Request.QueryStringritorna q=qvaluesoltanto
Marcel il

74
Request.Url.AbsoluteUri

Questa proprietà fa tutto il necessario, tutto in una chiamata succinta.


6
+1. Questa è la risposta migliore Dovrebbe essere preferito su Request.Url.ToString ().
Todd Menier,

10

Perché ASP.NET Coredovrai precisarlo:

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

Oppure puoi aggiungere un'istruzione using alla tua vista:

@using Microsoft.AspNetCore.Http.Extensions

poi

@Context.Request.GetDisplayUrl()

Il _ViewImports.cshtmlpotrebbe essere un posto migliore per questo@using


1
Grazie. Questo ha aiutato!
FlyingV,


9

se hai bisogno dell'URL completo in quanto tutto, dall'http alla stringa di query, devi concatenare le seguenti variabili

Request.ServerVariables("HTTPS") // to check if it's HTTP or HTTPS
Request.ServerVariables("SERVER_NAME") 
Request.ServerVariables("SCRIPT_NAME") 
Request.ServerVariables("QUERY_STRING")

2
Questo non tiene conto delle porte non standard (cioè non usando la porta 80 per http)
Spongeboy

1
potresti usare Request.ServerVariables ("SERVER_PORT") per il rilevamento delle porte!
armen,

1
Nota che questa risposta usa la sintassi VB.Net. In C #, ad esempio, utilizzare Request.ServerVariables ["HTTPS"].
Jaycer,

7

Meglio usare Request.Url.OriginalStringdi Request.Url.ToString()(secondo MSDN )


È meglio solo se hai davvero bisogno della stringa originale.
Dirk,

@DirkThe from link to MSDN above: "La stringa restituita dal metodo ToString può contenere caratteri di controllo, che possono danneggiare lo stato di un'applicazione console. È possibile utilizzare il metodo GetComponents con il formato UriFormat.SafeUnescaped per rimuovere i caratteri di controllo dalla stringa restituita ".
Eni,

Esatto, e questo non ha nulla a che fare con OriginalString.
Dirk,

5

Grazie ragazzi, ho usato una combinazione di entrambe le vostre risposte @Christian e @Jonathan per le mie specifiche esigenze.

"http://" + Request.ServerVariables["SERVER_NAME"] +  Request.RawUrl.ToString()

Non devo preoccuparmi di http sicuro, avevo bisogno della variabile servername e RawUrl gestisce il percorso dal nome di dominio e include la stringa di query se presente.


2
Dovresti anche sapere che RawUrl, a differenza di Request.Url, rappresenta l'URL della richiesta originale non mappato se viene utilizzato il mapping dell'URL.
Harpo,

SERVER_NAME spesso non restituisce l'URL "reale" utilizzato dal client. HTTP_HOST è probabilmente la forma migliore se vai a scavare direttamente .. manca anche il semplice HTTP-to-another-port.
user2864740

1

Se è necessario anche il numero di porta, è possibile utilizzare

Request.Url.Authority

Esempio:

string url = Request.Url.Authority + HttpContext.Current.Request.RawUrl.ToString();

if (Request.ServerVariables["HTTPS"] == "on")
{
    url = "https://" + url;
}
else 
{
    url = "http://" + url;
}

1

Prova quanto segue:

var FullUrl = Request.Url.AbsolutePath.ToString();
var ID = FullUrl.Split('/').Last();
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.