Як отримати URI кореневого домену в ASP.NET?


96

Скажімо, я розміщую веб-сайт за адресою http://www.foobar.com .

Чи є спосіб, яким я можу програмно встановити " http://www.foobar.com/ " у своєму коді позаду (тобто без необхідності твердокодувати його у своїй веб-конфігурації)?


7
Оскільки це залежить від запиту, ви можете спробувати шукати Requestоб’єкт.
Джон Сондерс,

Відповіді:


79

HttpContext.Current.Request.Url може отримати всю інформацію про URL-адресу. І може розбити URL-адресу на її фрагменти.


4
Так, чому голос проти? Не бачите чогось, що позначається як відповідь -і- часто голосували. : /
Зак

4
Мені також не подобається ця відповідь. blesh дав правильний, і це повинно було бути позначено як відповідь ...
Michal B.

-1 - Request.Url часто дає URL-адресу, наприклад "/ folder1 / folder2", і взагалі виключає домен.
Джастін

4
@Justin: Request.Url дає вам об'єкт Uri, у якому всі фрагменти розбиті для вас. Це не повинно давати вам рядок. Принаймні не у тій версії .net, яку я використовую
JoshBerke

6
Цю відповідь можна покращити, додавши код, який змушує її працювати так, як відповідь нижче, яка набрала більше голосів ...
The Jerm

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

Uri :: Метод GetLeftPart :

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

UriPartial Перерахування :

Схема та повноваження сегментів URI.


5
Набагато краще, ніж розбір Url!
Євгеніт

1
це найкраща відповідь! tnx!
AminM

Це має бути обрана відповідь. Забагато маніпуляцій із рядками, які не потрібні.
Ghasan

1
За допомогою цього методу http: // www.lala.xxx/blah/blah поверне http: // www.lala.xxx
live-love

+1 І не те саме, що. Автор, який - під час тестів, які я зробив на 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 , він правильно його отримує.
Michael La Voie

2
Дякуємо, що поділилися фактичним кодом замість посилання в іншому місці.
TheJerm

2
context.Request.Url.Port == 80 спричинить проблеми в HTTPS
Євгеніт

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 (якщо ви тестуєте localy). Якщо вам не потрібен порт, ви можете використовувати "http: //" + HttpContext.Current.Request.Url.Host;
CyberHawk

32

Якщо приклад 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 => повернути host.co.uk
www.host.co.uk => повернути host.co.uk
s1.www.host.co.uk => повернути 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.