Як отримати повний 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.