Как получить полный URL страницы, на которой я нахожусь в C #

163

Мне нужно иметь возможность получить полный URL-адрес страницы, на которой я нахожусь, из пользовательского элемента управления. Это просто вопрос объединения нескольких переменных запроса вместе? Если да, то какие? Или есть более простой способ?

RedWolves
источник
6
Всем, кто находится в веб-ферме с балансировкой нагрузки ... остерегайтесь номера порта, который появляется при использовании System.Url: stackoverflow.com/questions/7674850/…
felickz

Ответы:

155

Я обычно использую, Request.Url.ToString()чтобы получить полный URL-адрес (включая строку запроса), конкатенация не требуется.

Трэвис
источник
2
Если URL содержит «#», все символы после # не будут включены.
Крунал Сисодия
5
@KrunalSisodiya Я не думаю, что хэш URL-адреса когда-либо отправляется на сервер, но я могу ошибаться.
Трэвис
1
Request.Url.ToString()не включает queryString.
Йогеш Патель
321

Вот список, к которому я обычно обращаюсь для такого типа информации:

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 может выдать исключение на «очень плохих запрошенных путях».
user2864740
Очень полезный ответ, но не должны ли номера портов быть непротиворечивыми, чтобы избежать путаницы (при условии, что все примеры относятся к одному и тому же запросу? Например, Authority и Port подразумевают порт 80, но AbsoluteUri содержит порт 2000)
Молодой Боб,
Request.QueryStringвозвращается q=qvalueтолько
Марсель
74
Request.Url.AbsoluteUri

Это свойство делает все, что вам нужно, все в один лаконичный вызов.

DevelopingChris
источник
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

Request.RawUrl

FlySwat
источник
7
это не возвращает полный URL. Если полный URL-адрес - blah.com/1.1/home/main?a=1 Request.RawUrl вернет 1.1 / hom / main?
A
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"], например.
Джейсер
7

Лучше использовать, Request.Url.OriginalStringчем Request.Url.ToString()(в соответствии с MSDN )

Eni
источник
Лучше, если вам действительно нужна оригинальная строка.
Дирк
@DirkThe из ссылки на MSDN выше: «Строка, возвращаемая методом ToString, может содержать управляющие символы, которые могут повредить состояние консольного приложения. Вы можете использовать метод GetComponents с форматом UriFormat.SafeUnescaped для удаления управляющих символов из возвращенной строки «.
Eni
Точно, и это не имеет ничего общего с OriginalString.
Дирк
5

Спасибо, ребята, я использовал комбинацию обоих ваших ответов @Christian и @Jonathan для своих конкретных нужд.

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

Мне не нужно беспокоиться о безопасном http, нужна переменная servername, а RawUrl обрабатывает путь от имени домена и включает строку запроса, если она есть.

RedWolves
источник
2
Вы также должны знать, что RawUrl, в отличие от Request.Url, представляет исходный, не отображенный URL-адрес запроса, если используется отображение URL-адресов.
Harpo
SERVER_NAME часто не возвращает «реальный» URL, используемый клиентом. HTTP_HOST, вероятно, является лучшей формой, если вы собираетесь копать напрямую ... и пропускает простой HTTP-к-другому-порту.
user2864740
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;
}
IonB
источник
1

Попробуйте следующее -

var FullUrl = Request.Url.AbsolutePath.ToString();
var ID = FullUrl.Split('/').Last();
Абхишек Канрар
источник