Як отримати повний URL сторінки, на якій я перебуваю на C #


163

Мені потрібно мати можливість отримати повну URL-адресу сторінки, на якій я перебуваю, з боку управління користувача. Це лише питання об'єднання групи змінних Request? Якщо так, то які? Або існує більш симпатичний спосіб?


6
Для тих , хто в loadbalanced webfarm .. остерігайтеся номер порту , який з'являється при використанні System.Url: stackoverflow.com/questions/7674850 / ...
felickz

Відповіді:


155

Зазвичай я використовую, Request.Url.ToString()щоб отримати повну URL-адресу (включаючи рядок запитів), не потрібно з'єднання.


2
Якщо URL-адреса містить "#", усі символи після # не будуть включені.
Krunal Sisodiya

5
@KrunalSisodiya Я не думаю, що хеш URL-адреси ніколи не надсилається на сервер, але я можу помилитися.
travis

1
Request.Url.ToString()не включає queryString.
Йогеш Патель

320

Ось список, на який я зазвичай посилаюся для такого типу інформації:

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

Сподіваємось, Ви знайдете це корисним!


1
1) Є також Request.RawUrl; 2) Request.Url може кинути виняток на "дуже погані запитувані шляхи".
користувач2864740

Дуже корисна відповідь, але чи не повинні номери портів бути послідовними, щоб уникнути плутанини (якщо припустити, що всі приклади мають один і той же запит? Наприклад, Авторитет і Порт мають на увазі порт 80, але AbsoluteUri містить порт 2000)
Янг Боб

Request.QueryStringповертається q=qvalueлише
Марсель

74
Request.Url.AbsoluteUri

Ця властивість виконує все необхідне, все за один короткий дзвінок.


6
+1. Це найкраща відповідь. Слід віддати перевагу Request.Url.ToString ().
Тодд Меньє

10

Для цього ASP.NET Coreвам потрібно буде прописати це:

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

Або ви можете додати до перегляду користувачу:

@using Microsoft.AspNetCore.Http.Extensions

тоді

@Context.Request.GetDisplayUrl()

Можливо, _ViewImports.cshtmlце буде кращим місцем для цього@using


1
Дякую. Це допомогло!
FlyingV


9

якщо вам потрібна повна URL-адреса, як і все від http до рядка запитів, вам потрібно буде об'єднати наступні змінні

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

2
При цьому не враховуються нестандартні порти (тобто не використовується порт 80 для http)
Spongeboy

1
ви можете використовувати Request.ServerVariables ("SERVER_PORT") для виявлення портів!
армен

1
Зауважте, що у цій відповіді використовується синтаксис VB.Net. У C # використовуйте, наприклад, Request.ServerVariables ["HTTPS"].
jaycer

7

Краще використовувати, Request.Url.OriginalStringніж Request.Url.ToString()(згідно MSDN )


Краще лише, якщо вам справді потрібна оригінальна рядок.
Дірк

@DirkThe за посиланням на MSDN вище: "Рядок, повернутий методом ToString, може містити контрольні символи, які можуть пошкодити стан консольної програми. Ви можете використовувати метод GetComponents з форматом UriFormat.SafeUnescaped для видалення контрольних символів із повернутого рядка . "
Ені

Саме так, і це не має нічого спільного OriginalString.
Дірк

5

Дякую, хлопці, я використовував поєднання обох ваших відповідей @Christian та @Jonathan для моєї конкретної потреби.

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

Мені не потрібно турбуватися про безпечний http, потрібна змінна назва сервера, і RawUrl обробляє шлях від доменного імені та включає в себе рядок запитів, якщо така є.


2
Ви також повинні знати, що RawUrl, на відміну від Request.Url, являє собою оригінальну, невідомену URL-адресу запиту, якщо використовується відображення URL-адреси.
гарпо

SERVER_NAME часто не повертає "реальну" URL-адресу, яку використовує клієнт. HTTP_HOST - це, мабуть, краща форма, якщо ви збираєтеся копатися безпосередньо .. також пропускає простий HTTP-інший-порт.
користувач2864740

1

Якщо вам також потрібен номер порту, ви можете використовувати

Request.Url.Authority

Приклад:

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

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.