.NET - Отримайте протокол, хост і порт


228

Чи є простий спосіб у .NET швидко отримати поточний протокол, хост і порт? Наприклад, якщо я перебуваю за такою URL-адресою:

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

Мені потрібно повернутися:

http://www.mywebsite.com:80

Я знаю, що можу використати, Request.Url.AbsoluteUriщоб отримати повну URL-адресу, і знаю, що можу використовувати Request.Url.Authorityхост і порт, але я не впевнений у найкращому способі отримати протокол без розбору рядка URL-адреси.

Будь-які пропозиції?


1
Дивіться моя відповідь на simlar питання тут - 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 в зворотний виклик (з приватним портом), хост буде недоступний.
doveryai

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, він буде включений у результат.


12
Це найкращий приклад на мою думку. Він працює для localhost: порту та живих екземплярів.
The Muffin Man

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

Я сподіваюся, що це допомагає. :)


1
Я віддаю перевагу цьому методу, я можу отримати лише потрібний мені peice і не потрібно хвилюватися про те, чи достатньо сформована струна, щоб отримати порт. +1
Jrud

Ще кілька деталей щодо цих властивостей: blog.jonschneider.com/2014/10/…
Джон Шнайдер

33

Більш структурований спосіб отримати це - використовувати UriBuilder. Це дозволяє уникнути прямої маніпуляції з рядком.

var builder = new UriBuilder(Request.Url.Scheme, Request.Url.Host, Request.Url.Port);

23

Запит.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 () ist там недоступний)
Саша,

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

Клас Урі пропонує цілий спектр методів, багатьох з яких я не перераховував.

У моєму випадку мені потрібно було схопити LocalHostразом із Port Number, тому я це зробив:

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

Який успішно схопив: http://localhost:12345

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