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.