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

98

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

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

ядро
источник
7
Поскольку это зависит от запроса, вы можете попробовать поискать в Requestобъекте.
Джон Сондерс,

Ответы:

81

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

Джош Берке
источник
4
Да, почему голосование против? Не видите, что что-то помечено как ответ и часто отклоняется. : /
Zack
4
Мне тоже не нравится этот ответ. blesh дал правильный ответ, и это должно было быть отмечено как ответ ...
Михал Б.
-1 - Request.Url часто дает URL-адрес, например "/ folder1 / folder2", и исключает домен полностью.
Джастин
4
@Justin: Request.Url дает вам объект Uri, в котором для вас разбиты все части. Это не должно давать вам строки. По крайней мере, не в той версии .net, которую я использую
JoshBerke
6
Этот ответ можно улучшить, добавив код, который заставляет его работать, как приведенный ниже ответ, который набирает больше голосов ...
theJerm
172
string baseUrl = Request.Url.GetLeftPart(UriPartial.Authority);

Uri :: GetLeftPart Метод :

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

UriPartial Enumeration :

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

Джордж
источник
5
Намного лучше, чем разбор URL!
Евгений 05
1
это лучший ответ! tnx!
AminM
Это должен быть выбранный ответ. Слишком много ненужных манипуляций со строками.
Гасан
1
Используя этот метод, http: // www.lala.xxx/blah/blah вернет http: // www.lala.xxx
live-love
+1 И не то же самое, что .Authority, который - в тестах, которые я провел на localhost - не учитывает часть протокола (http: //).
GGleGrand
122

Для тех, кому все еще интересно, более полный ответ доступен на 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;
    }
}
Брайан Хэсден
источник
4
Работает отлично. Если сайт является сервером: 8080 / MySiteName , он получает его правильно.
Майкл Ла Вуа,
2
Спасибо, что поделились реальным кодом, а не ссылкой где-то еще.
theJerm 02
2
context.Request.Url.Port == 80 вызовет проблемы в HTTPS
Evgenyt 05
7
Внимание! Не работает для 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")или использовать ответ ниже
razon
1
Работает также для localhost (если вы тестируете локально). Если вам не нужен порт, вы можете использовать «http: //» + HttpContext.Current.Request.Url.Host;
CyberHawk,
34

Если пример 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"
Дирадж Палагири
источник
1
Нет-нет. .Hostиз "http://www.foobar.com/Page1"есть www.foobar.com, нет foobar.com.
Челидзе
1
да вы правы, обновил ответ. @tchelidze спасибо
Dheeraj Palagiri
27
string hostUrl = Request.Url.Scheme + "://" + Request.Url.Host; //should be "http://hostnamehere.com"
Бен Леш
источник
16

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

HttpContext.Current.Request.Url

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

HttpContext.Current.Request.Url.Host

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

Рекс М
источник
1
простейшее решение здесь
full_prog_full
4
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 => return host.co.uk
www.host.co.uk => return host.co.uk
s1.www.host.co.uk => return host.co.uk

NQuenault
источник
Я понимаю, что это старый пост, но хорошо сделанный NQuenault, я не очень хорошо разбираюсь в Regex Expressions. Именно то, что мне нужно.
JeffreyJ
@nquenault какие-либо мысли о том, как лучше всего обрабатывать имя хоста, такое как www.abc.com? Спасибо!
Гэри Юэн Парк,
4

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

Request.Url.Scheme + "://" + Request.Url.Host + ":" + Request.Url.Port
JonathanC
источник
3

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

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

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

праздные23
источник
3

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

строка url = HttpContext.Request.Url.Authority;

Fribu - Умные решения
источник
1

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

string scheme = "http://";
string rootUrl = default(string);
if (Request.ServerVariables["HTTPS"].ToString().ToLower() == "on")
{
  scheme = "https://";
}
rootUrl = scheme + Request.ServerVariables["SERVER_NAME"].ToString();
Саул Долгин
источник
1
string host = Request.Url.Host;
Regex domainReg = new Regex("([^.]+\\.[^.]+)$");
HttpCookie cookie = new HttpCookie(cookieName, "true");
if (domainReg.IsMatch(host))
{
  cookieDomain = domainReg.Match(host).Groups[1].Value;                                
}
Шон Констанс
источник
1

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

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

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

Tomepenn
источник