Jak uzyskać pełny adres URL strony, na której się znajduję, w języku C #

163

Muszę mieć dostęp do pełnego adresu URL strony, na której się znajduję, z poziomu kontrolki użytkownika. Czy jest to tylko kwestia połączenia razem kilku zmiennych żądania? Jeśli tak, które? A może jest prostszy sposób?

Czerwone Wilki
źródło
6
Każdemu w loadbalanced Webfarm .. strzeżcie numer portu, który pojawi się podczas korzystania System.Url: stackoverflow.com/questions/7674850/...
felickz

Odpowiedzi:

155

Zwykle używam, Request.Url.ToString()aby uzyskać pełny adres URL (w tym querystring), nie jest wymagana żadna konkatenacja.

travis
źródło
2
Jeśli adres URL zawiera „#”, cały znak po # nie zostanie uwzględniony.
Krunal Sisodiya
5
@KrunalSisodiya Nie sądzę, aby hash adresu URL był kiedykolwiek wysyłany na serwer, ale mogę się mylić.
travis
1
Request.Url.ToString()nie zawiera queryString.
Yogesh Patel,
320

Oto lista, do której zwykle odwołuję się w przypadku tego typu informacji:

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

Mamy nadzieję, że okaże się to przydatne!

Mohsen
źródło
1
1) Istnieje również Request.RawUrl; 2) Request.Url może zgłosić wyjątek na „bardzo złych żądanych ścieżkach”.
user2864740
Bardzo pomocna odpowiedź, ale czy numery portów nie powinny być spójne, aby uniknąć nieporozumień (zakładając, że wszystkie przykłady dotyczą tego samego żądania? Np. Urząd i port sugerują port 80, ale AbsoluteUri zawiera port 2000)
Młody Bob
Request.QueryStringq=qvaluetylko zwraca
Marcel
74
Request.Url.AbsoluteUri

Ta właściwość robi wszystko, czego potrzebujesz, wszystko w jednym zwięzłym połączeniu.

DevelopingChris
źródło
6
+1. To najlepsza odpowiedź. Powinien być preferowany zamiast Request.Url.ToString ().
Todd Menier
10

Dla ASP.NET Coretrzeba przeliterować:

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

Możesz też dodać do swojego widoku instrukcję using:

@using Microsoft.AspNetCore.Http.Extensions

następnie

@Context.Request.GetDisplayUrl()

To _ViewImports.cshtmlmoże być lepsze miejsce do tego@using

Serj Sagan
źródło
1
Dzięki. To pomogło!
FlyingV
9

Request.RawUrl

FlySwat
źródło
7
to nie zwraca pełnego adresu URL. Jeśli pełny adres URL to blah.com/1.1/home/main?a=1 Request.RawUrl zwróci wartość 1.1 / hom / main? A = 1
jnoreiga
9

jeśli potrzebujesz pełnego adresu URL jako wszystkiego, od http po kwerendę, będziesz musiał połączyć następujące zmienne

Request.ServerVariables("HTTPS") // to check if it's HTTP or HTTPS
Request.ServerVariables("SERVER_NAME") 
Request.ServerVariables("SCRIPT_NAME") 
Request.ServerVariables("QUERY_STRING")
Christian Hagelid
źródło
2
To nie bierze pod uwagę niestandardowych portów (tj. Nie używa portu 80 dla http)
Spongeboy,
1
możesz użyć Request.ServerVariables ("SERVER_PORT") do wykrywania portów!
armen
1
Zwróć uwagę, że ta odpowiedź używa składni VB.Net. W języku C # użyj na przykład Request.ServerVariables ["HTTPS"].
jaycer
7

Lepiej używać Request.Url.OriginalStringniż Request.Url.ToString()(według MSDN )

Eni
źródło
Lepiej jest tylko wtedy, gdy naprawdę potrzebujesz oryginalnego ciągu.
Dirk
@DirkThe from link do MSDN powyżej: „Ciąg zwracany przez metodę ToString może zawierać znaki sterujące, które mogą uszkodzić stan aplikacji konsoli. Możesz użyć metody GetComponents z formatem UriFormat.SafeUnescaped, aby usunąć znaki sterujące ze zwracanego ciągu ”.
Eni
Dokładnie, i to nie ma z tym nic wspólnego OriginalString.
Dirk
5

Dzięki chłopaki, użyłem kombinacji obu twoich odpowiedzi @Christian i @Jonathan dla mojej konkretnej potrzeby.

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

Nie muszę się martwić o bezpieczny http, potrzebuję zmiennej servername, a RawUrl obsługuje ścieżkę z nazwy domeny i zawiera kwerendę, jeśli jest obecna.

Czerwone Wilki
źródło
2
Powinieneś również wiedzieć, że RawUrl, w przeciwieństwie do Request.Url, reprezentuje oryginalny, niezamapowany adres URL żądania, jeśli używane jest mapowanie adresu URL.
harpo
SERVER_NAME często nie zwraca „prawdziwego” adresu URL używanego przez klienta. HTTP_HOST jest prawdopodobnie lepszą formą, jeśli zamierzasz zagłębić się bezpośrednio .. również pomija proste HTTP-to-inny-port.
user2864740
1

Jeśli potrzebujesz również numeru portu, możesz użyć

Request.Url.Authority

Przykład:

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

if (Request.ServerVariables["HTTPS"] == "on")
{
    url = "https://" + url;
}
else 
{
    url = "http://" + url;
}
IonB
źródło
1

Wypróbuj następujące rozwiązania -

var FullUrl = Request.Url.AbsolutePath.ToString();
var ID = FullUrl.Split('/').Last();
Abhishek Kanrar
źródło