Как получить URI корневого домена в ASP.NET?

Допустим, я размещаю веб-сайт по адресу http://www.foobar.com.

Есть ли способ программно установить "http://www.foobar.com/" в моем коде? (т.е. без необходимости жесткого кода в моей веб-конфигурации)?


person core    schedule 31.07.2009    source источник
comment
Поскольку это зависит от запроса, вы можете попробовать поискать в объекте Request.   -  person John Saunders    schedule 01.08.2009


Ответы (11)


HttpContext.Current.Request.Url может получить вам всю информацию по URL. И может разбить URL-адрес на его фрагменты.

person JoshBerke    schedule 31.07.2009
comment
Да, почему голосование против? Не видите что-то, помеченное как ответ - и - часто отвергаемое. :/ - person Zack; 01.08.2009
comment
Мне тоже не нравится этот ответ. Блеш дал правильный ответ, и это должно было быть помечено как ответ ... - person Michal B.; 27.11.2011
comment
-1 — Request.Url часто дает такой URL-адрес, как /folder1/folder2, и полностью исключает домен. - person Justin; 03.04.2012
comment
@Justin: Request.Url дает вам объект Uri, в котором для вас разбиты все части. Это не должно вас беспокоить. По крайней мере, не в той версии .net, которую я использую. - person JoshBerke; 04.04.2012
comment
Этот ответ можно улучшить, добавив код, который заставляет его работать как ответ ниже, который имеет больше голосов... - person theJerm; 21.12.2012
comment
Я проголосовал против, потому что, хотя это указывает на некоторую возможную реализацию ответа, это не ответ. Рассмотрим следующие случаи: 1) когда корень приложения отличается от /, 2) когда URI запроса включает порт, 3) различие между HTTPS и HTTP... - person Isaac Llopis; 28.08.2014
comment
@IsaacLlopis: Opp не просил корень приложения, он просил корневой домен, я не понимаю, почему проблема с портом? Попробуйте Request.Url.Port. Хм Также это дает вам схему. На самом деле посмотрите на все другие ответы, все они используют одно и то же. Я указал оппоненту, как найти информацию. Таким образом, он мог создать свое собственное решение - person JoshBerke; 29.08.2014
comment
Ответ Джорджа должен быть помечен как правильный - этот ответ работает не во всех случаях - например. номер порта в моем случае - person fubo; 18.03.2015
comment
@fubo HttpContext.Current.Request.Url.Port дает вам порт. И для Исаака Да, я мог бы сказать HttpContext.Current.Request.Url.Host или HttpContext.Current.Request.Url.Authority вместо этого я указал Opp на документацию для класса Url, который дал ему всю необходимую информацию. - person JoshBerke; 22.03.2015
comment
Возможная инъекция заголовка хоста. - person Bose_geek; 16.11.2017
comment
HttpContext.Current.Request.Url хорошо работает внутри контроллеров, но если вы используете его при запуске, URL-адрес теряет важную информацию. Он возвращает http вместо https, 127.0.0.1 вместо пользовательского источника и имени приложения, порт 80 вместо конкретного https (например, 443). - person Alex Valchuk; 29.11.2018
comment
Так что все ответы здесь кажутся отличными от того, что сработало для меня. Это разница между asp.net и основной версией? У меня работает Request.Host.ToString(). - person ahong; 21.05.2019

string baseUrl = Request.Url.GetLeftPart(UriPartial.Authority);

Метод Uri::GetLeftPart:

Метод GetLeftPart возвращает строку, содержащую крайнюю левую часть строки URI, заканчивающуюся частью, указанной частью.

Перечисление UriPartial:

Сегменты схемы и полномочий URI.

person George    schedule 19.11.2009
comment
Гораздо лучше, чем парсинг URL! - person Evgenyt; 05.02.2013
comment
Это должен быть выбранный ответ. Слишком много ненужных манипуляций со строками. - person Ghasan غسان; 07.12.2015
comment
Используя этот метод, http://www.lala.xxx/blah/blah вернет http://www.lala.xxx. - person live-love; 14.03.2016
comment
+1 И не то же самое, что .Authority, который - в тестах, которые я провел на локальном хосте - не включает часть протокола (http://). - person GGleGrand; 17.06.2016
comment
UriPartial.Authority может вызвать проблемы с URL-адресом общедоступного домена (в некоторых случаях он возвращает внутренний URL-адрес в зависимости от конфигурации сети) - person toregua; 19.09.2016

Для тех, кто все еще задается вопросом, более полный ответ доступен по адресу http://devio.wordpress.com/2009/10/19/get-absolut-url-of-asp-net-application/.

public string FullyQualifiedApplicationPath
{
    get
    {
        //Return variable declaration
        var appPath = string.Empty;

        //Getting the current context of HTTP request
        var context = HttpContext.Current;

        //Checking the current context content
        if (context != null)
        {
            //Formatting the fully qualified website url/name
            appPath = string.Format("{0}://{1}{2}{3}",
                                    context.Request.Url.Scheme,
                                    context.Request.Url.Host,
                                    context.Request.Url.Port == 80
                                        ? string.Empty
                                        : ":" + context.Request.Url.Port,
                                    context.Request.ApplicationPath);
        }

        if (!appPath.EndsWith("/"))
            appPath += "/";

        return appPath;
    }
}
person Brian Hasden    schedule 04.11.2009
comment
Работал отлично. Если сайт server:8080/MySiteName, он получает его правильно. - person Michael La Voie; 19.05.2011
comment
Спасибо, что поделились фактическим кодом вместо ссылки где-то еще. - person theJerm; 02.01.2013
comment
Без проблем. Я сталкивался с ответами, которые содержат ссылки на другие сайты, и это расстраивает, когда ссылка не работает, а затем мне приходится искать контент в кеше Google или Wayback Machine. - person Brian Hasden; 02.01.2013
comment
context.Request.Url.Port == 80 вызовет проблемы с HTTPS - person Evgenyt; 05.02.2013
comment
Ты прав. Он должен проверять как 80, так и 443, но я не верю, что указание порта 443 и https, так как схема ничему не повредит. - person Brian Hasden; 06.02.2013
comment
Внимание! Не работает для https. Для https необходимо заменить context.Request.Url.Port == 80 на (context.Request.Url.Port == 80 && context.Request.Url.Scheme == "http") || (context.Request.Url.Port == 443 && context.Request.Url.Scheme == "https") или использовать ответ ниже - person razon; 22.09.2014
comment
Работает также для локального хоста (если вы тестируете локально). Если вам не нужен порт, вы можете использовать http:// + HttpContext.Current.Request.Url.Host; - person CyberHawk; 24.09.2015

Если пример URL-адреса http://www.foobar.com/Page1

HttpContext.Current.Request.Url; //returns "http://www.foobar.com/Page1"


HttpContext.Current.Request.Url.Host; //returns "www.foobar.com"


HttpContext.Current.Request.Url.Scheme; //returns "http/https"


HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority); //returns "http://www.foobar.com"
person Dheeraj Palagiri    schedule 11.02.2015
comment
Нет нет. .Host из "http://www.foobar.com/Page1" это www.foobar.com, а не foobar.com. - person tchelidze; 13.02.2019
comment
да, вы правы, обновил ответ. @tchelidze спасибо - person Dheeraj Palagiri; 13.02.2019

Чтобы получить всю строку URL-адреса запроса:

HttpContext.Current.Request.Url

Чтобы получить часть запроса www.foo.com:

HttpContext.Current.Request.Url.Host

Обратите внимание, что вы в какой-то степени зависите от факторов, находящихся за пределами вашего приложения ASP.NET. Если IIS настроен на прием нескольких или любых заголовков хоста для вашего приложения, то любой из этих доменов, которые разрешены для вашего приложения через DNS, может отображаться как URL-адрес запроса, в зависимости от того, какой из них ввел пользователь.

person Rex M    schedule 31.07.2009
comment
самое простое решение здесь - person full_prog_full; 11.07.2016

Match match = Regex.Match(host, "([^.]+\\.[^.]{1,3}(\\.[^.]{1,3})?)$");
string domain = match.Groups[1].Success ? match.Groups[1].Value : null;

host.com => вернуть host.com
s.host.com => вернуть host.com

host.co.uk => вернуть host.co.uk
www.host.co.uk => вернуть host.co.uk
s1.www.host.co.uk => вернуть хост. co.uk

person NQuenault    schedule 13.06.2013
comment
Я понимаю, что это старый пост, но хорошо сделанный NQuenault, я не очень хорошо разбираюсь в выражениях регулярных выражений, так что хорошо сделано. Именно то, что мне было нужно. - person JeffreyJ; 13.01.2015
comment
@nquenault есть мысли о том, как лучше всего обращаться с именем хоста, например www.abc.com? Спасибо! - person Gary Ewan Park; 02.12.2015

-- Добавление порта может помочь при работе с IIS Express.

Request.Url.Scheme + "://" + Request.Url.Host + ":" + Request.Url.Port
person JonathanC    schedule 30.08.2015

Я знаю, что это старше, но правильный способ сделать это сейчас

string Domain = HttpContext.Current.Request.Url.Authority

Это позволит получить DNS или IP-адрес с портом для сервера.

person idlehands23    schedule 11.03.2013

Это также работает:

URL-адрес строки = HttpContext.Request.Url.Authority;

person Fribu - Smart Solutions    schedule 19.01.2015

Пример С# ниже:

string scheme = "http://";
string rootUrl = default(string);
if (Request.ServerVariables["HTTPS"].ToString().ToLower() == "on")
{
  scheme = "https://";
}
rootUrl = scheme + Request.ServerVariables["SERVER_NAME"].ToString();
person Saul Dolgin    schedule 31.07.2009

Это вернет именно то, что вы просите.

Dim mySiteUrl = Request.Url.Host.ToString()

Я знаю, что это старый вопрос. Но мне нужен был такой же простой ответ, и он возвращает именно то, что спрашивают (без http://).

person tomepenn    schedule 03.01.2014
comment
без http:// Тогда это не совсем то, что просят... - person Eric Sjöström; 17.03.2021