Как я могу получить 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


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, я не очень хорошо разбираюсь в Regex Expressions. Именно то, что мне нужно.
JeffreyJ

@nquenault какие-либо мысли о том, как лучше всего обрабатывать имя хоста, такое как www.abc.com? Спасибо!
Гэри Юэн Парк,

4

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

Request.Url.Scheme + "://" + Request.Url.Host + ":" + Request.Url.Port


3

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

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

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



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: //).

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.