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?


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.


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!


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.


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


1
Dzięki. To pomogło!
FlyingV


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")

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 )


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.


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

1

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

var FullUrl = Request.Url.AbsolutePath.ToString();
var ID = FullUrl.Split('/').Last();
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.