Вопрос

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

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

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

http://www.mywebsite.com:80

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

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

Это было полезно?

Решение

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

Uri uri = new Uri("http://www.mywebsite.com:80/pages/page1.aspx");
string requested = uri.Scheme + Uri.SchemeDelimiter + uri.Host + ":" + uri.Port;

Другие советы

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

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

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

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

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

Request.Url вернет вам Ури запроса.Получив это, вы сможете получить практически все, что захотите.Для получения протокола позвоните по номеру Схема свойство.

Образец:

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

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

Еще более короткий путь может потребовать более новой версии ASP.Net:

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top