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

229

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

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

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

http://www.mywebsite.com:80

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

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

Джереми
источник
1
Смотрите мой ответ на вопрос Симлара здесь - stackoverflow.com/a/1534478/98740
WDuffy

Ответы:

172

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

Uri uri = new Uri("http://www.mywebsite.com:80/pages/page1.aspx");
string requested = uri.Scheme + Uri.SchemeDelimiter + uri.Host + ":" + uri.Port;
стог
источник
26
Или запрашиваемая строка = uri.Scheme + Uri.SchemeDelimiter + uri.Authority;
Tranmq
17
Возможно, это неправильный ответ, поскольку он вставляет «:», даже если нет порта. Используйте, Uri.GetLeftPartкак указывает @dthrasher
gman
Обратите внимание, что в некоторых случаях вы все еще хотите объединить с помощью uri.Headers ["Host"] вместо GetLeftPart (), например, за прокси-сервером ваш сервис может прослушивать другой / нестандартный порт, и если вы используете этот URL в обратный вызов (с частным портом) хоста будет недоступен.
доверяю
408

Несмотря на то, что @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, он был бы включен в результат.

dthrasher
источник
12
Это лучший пример на мой взгляд. Это работает для локального: порта и живых экземпляров.
Человек
13
GetLeftPart - действительно, OMG, хорошее название.
Валентин Кузуб,
Кто-нибудь знает, есть ли у этой части URL общее имя? В JavaScript это называется Origin, но я не уверен, что это универсально согласовано: serverfault.com/questions/757494/…
Дирк Бур
1
Microsoft использует для этого термин «полномочия», но я не знаю, является ли это стандартным термином. См stackoverflow.com/questions/2142910/...
dthrasher
1
Мне лично не нравится использовать Uriкласс таким образом. Существует множество случаев, когда этот конструктор создает исключение. В большинстве случаев я предпочитаю, чтобы мой код был немного более прощающим, чем прерывать задачу под рукой.
Джонатан Вуд
60

Хорошо, если вы делаете это в 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

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

Holger
источник
1
Я предпочитаю этот метод, я могу получить только тот кусочек, который мне нужен, и мне не нужно беспокоиться о том, достаточно ли хорошо сформирована строка, чтобы получить порт. +1
Джруд
Еще несколько подробностей об этих свойствах: blog.jonschneider.com/2014/10/…
Джон Шнайдер
33

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

var builder = new UriBuilder(Request.Url.Scheme, Request.Url.Host, Request.Url.Port);
Хаонан Тан
источник
23

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

Образец:

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

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

Дейл Рэйган
источник
20

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

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

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

Марк Шапиро
источник
1
Отлично, потому что он работает в PCL (.GetLeftPart () там не доступен)
Саша
10

Очень похоже на ответ Хольгера. Если вам нужно захватить 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

benscabbia
источник