.NET - получить протокол, хост и порт

Есть ли в .NET простой способ быстро получить текущий протокол, хост и порт? Например, если я нахожусь по следующему URL:

http://www.mywebsite.com:80/pages/page1.aspx

Мне нужно вернуть:

http://www.mywebsite.com:80

Я знаю, что могу использовать Request.Url.AbsoluteUriдля получения полного URL-адреса, и я знаю, что могу использовать Request.Url.Authorityдля получения хоста и порта, но я не уверен в наилучшем способе получить протокол без разбора строки URL-адреса.

Какие-либо предложения?

22.08.2008 02:18:28
Смотрите мой ответ на вопрос Симлара здесь - stackoverflow.com/a/1534478/98740
WDuffy 18.06.2015 16:33:33
7 ОТВЕТОВ
РЕШЕНИЕ

Следующий (C #) код должен помочь

Uri uri = new Uri("http://www.mywebsite.com:80/pages/page1.aspx");
string requested = uri.Scheme + Uri.SchemeDelimiter + uri.Host + ":" + uri.Port;
168
30.03.2015 23:24:44
Или запрашиваемая строка = uri.Scheme + Uri.SchemeDelimiter + uri.Authority;
tranmq 1.03.2012 22:51:34
Возможно, это неправильный ответ, так как он вставит «:», даже если нет порта. Используйте, Uri.GetLeftPartкак указывает @dthrasher
gman 28.01.2016 10:49:40

Request.Url вернет вам Uri запроса. Когда у вас есть это, вы можете получить практически все, что захотите. Чтобы получить протокол, вызовите свойство Scheme .

Образец:

Uri url = Request.Url;
string protocol = url.Scheme;

Надеюсь это поможет.

23
22.08.2008 02:48:54

Несмотря на то, что @Rick имеет приемлемый ответ на этот вопрос, на самом деле есть более короткий способ сделать это, используя Uri.GetLeftPart()метод с плохим именем .

Uri url = new Uri("http://www.mywebsite.com:80/pages/page1.aspx");
string output = url.GetLeftPart(UriPartial.Authority);

Однако есть одна загвоздка GetLeftPart(). Если порт является портом по умолчанию для схемы, он удалит его. Так как порт 80 является портом по умолчанию для http, вывод GetLeftPart()в моем примере выше будет http://www.mywebsite.com.

Если бы номер порта отличался от 80, он был бы включен в результат.

402
23.02.2009 15:45:56
Это лучший пример на мой взгляд. Это работает для локального: порта и живых экземпляров.
The Muffin Man 11.10.2011 19:13:30
GetLeftPart - действительно, OMG, хорошее название.
Valentin Kuzub 18.03.2015 14:36:21
Кто-нибудь знает, если эта часть URL имеет общее имя? В JavaScript это называется Origin, но я не уверен, что это универсально согласовано: serverfault.com/questions/757494/…
Dirk Boer 16.02.2016 11:26:02
Microsoft использует для этого термин «полномочия», но я не знаю, является ли это стандартным термином. См stackoverflow.com/questions/2142910/...
dthrasher 17.02.2016 02:29:13
Мне лично не нравится использовать Uriкласс таким образом. Существует множество случаев, когда этот конструктор создает исключение. В большинстве случаев я предпочитаю, чтобы мой код был немного более прощающим, чем прерывать задачу под рукой.
Jonathan Wood 2.01.2017 02:24:25

Хорошо, если вы делаете это в Asp.Net или имеете доступ к HttpContext.Current.Request, я бы сказал, что это более простые и более общие способы их получения:

var scheme = Request.Url.Scheme; // will get http, https, etc.
var host = Request.Url.Host; // will get www.mywebsite.com
var port = Request.Url.Port; // will get the port
var path = Request.Url.AbsolutePath; // should get the /pages/page1.aspx part, can't remember if it only get pages/page1.aspx

Надеюсь, это поможет. :)

60
16.11.2010 14:42:41
Я предпочитаю этот метод, я могу получить только тот кусочек, который мне нужен, и мне не нужно беспокоиться о том, достаточно ли хорошо сформирована строка, чтобы получить порт. +1
Jrud 2.11.2011 14:37:37
Еще несколько подробностей об этих свойствах: blog.jonschneider.com/2014/10/…
Jon Schneider 7.06.2016 19:25:13

Более структурированный способ получить это - использовать UriBuilder. Это позволяет избежать прямых манипуляций со строками.

var builder = new UriBuilder(Request.Url.Scheme, Request.Url.Host, Request.Url.Port);
33
8.03.2011 21:56:59

Еще короче, может потребоваться более новый ASP.Net:

string authority = Request.Url.GetComponents(UriComponents.SchemeAndServer,UriFormat.Unescaped)

Перечисление UriComponents позволяет указать, какие компоненты URI вы хотите включить.

19
3.11.2015 08:53:37
Отлично, потому что он работает в PCL (.GetLeftPart () там не доступен)
Sascha 23.02.2016 19:13:07

Очень похоже на ответ Хольгера. Если вам нужно захватить URL, можно сделать что-то вроде:

Uri uri = Context.Request.Url;         
var scheme = uri.Scheme // returns http, https
var scheme2 = uri.Scheme + Uri.SchemeDelimiter; // returns http://, https://
var host = uri.Host; // return www.mywebsite.com
var port = uri.Port; // returns port number

Класс Uri предоставляет целый ряд методов, многие из которых я не перечислил.

В моем случае мне нужно было взять LocalHostс собой Port Number, вот что я сделал:

var Uri uri = Context.Request.Url;
var host = uri.Scheme + Uri.SchemeDelimiter + uri.Host + ":" + uri.Port; 

Который успешно схватил: http://localhost:12345

10
14.11.2015 22:40:55