Як отримати поточне доменне ім'я в ASP.NET


84

Я хочу отримати поточне доменне ім'я в asp.net c #.

Я використовую цей код.

string DomainName = HttpContext.Current.Request.Url.Host;

Моя URL-адреса є, localhost:5858але вона повертається лише localhost.

Зараз я використовую свій проект у localhost. Я хочу отримати localhost: 5858.

Інший приклад - коли я використовую цей домен

www.somedomainname.com

Я хочу отримати somedomainname.com

Будь ласка, дайте мені уявлення про те, як отримати поточне доменне ім’я.


1
Ім'я хосту та доменне ім'я - це 2 різні речі. Ви хочете домен, який зіставляється з вашою конкретною IP-адресою, або ім'я хосту машини, на якій він працює?
Роб Гудвін,


var base_url = "@ Request.Url.GetLeftPart (UriPartial.Authority) @ Url.Content (" ~ / ")"
Принц Прасад

Відповіді:


81

Використовувати Request.Url.Hostдоцільно - це спосіб отримання значення Host:заголовка HTTP , який вказує, яке ім’я хосту (доменне ім’я) хоче UA (браузер), оскільки частина шляху ресурсу в запиті HTTP не включає ім’я хосту.

Зверніть увагу, що localhost:5858це не доменне ім’я, це специфікатор кінцевої точки, також відомий як „повноваження”, що включає ім’я хосту та номер порту TCP. Це отримується шляхом доступу Request.Uri.Authority.

Крім того, вона не діє , щоб отримати somedomain.comвід www.somedomain.comтому що веб - сервер може бути налаштовані для іншого сайту по www.somedomain.comпорівнянні з somedomain.com, однак , якщо ви впевнені , що це справедливо у вашому випадку , то вам необхідно вручну розібрати ім'я хоста, незважаючи на використання String.Split('.')твору в щіпка.

Зверніть увагу, що конфігурація веб-сервера (IIS) відрізняється від конфігурації ASP.NET, і що ASP.NET насправді абсолютно не знає про конфігурацію прив'язки HTTP веб-сайтів та веб-програм, під якою вона працює. Той факт, що і IIS, і ASP.NET мають однакові конфігураційні файли ( web.config), є червоною оселедцем.


123

Спробуйте отримати "ліву частину" URL-адреси, наприклад:

string domainName = HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority);

Це дасть вам або http://localhost:5858чи https://www.somedomainname.comви на місцевому або виробництві чи. Якщо ви хочете скинути wwwчастину, вам слід налаштувати IIS на це, але це вже інша тема.

Зверніть увагу, що отримана URL-адреса не матиме косої риски.


7
На мою думку, це повинна бути найкраща відповідь.
Андрій

Це чудово працювало для моїх потреб. Однак одне невелике виправлення: під час запиту частини авторизації повернутий рядок не включатиме роздільник кінцевого шляху. Отже:http://localhost:60333
Воля

1
var base_url = "@ Request.Url.GetLeftPart (UriPartial.Authority) @ Url.Content (" ~ / ")"
Принц Прасад

1
Здається, це не працює на Asp.Net Core 2.2. Я отримую 'HttpContext' не містить визначення для 'Current', і жодного доступного методу розширення 'Current', що приймає перший аргумент типу 'HttpContext', не вдається знайти (вам не вистачає директиви using або посилання на збірку?).
Stian

@Stian Очевидно, на це вже є інша публікація: stackoverflow.com/questions/31243068/… . Ці відповіді зосереджуються лише на частині URI.
Артуро Торрес Санчес,

43

Ось знімок екрана Request.RequestUriта всі його властивості для ознайомлення.

введіть тут опис зображення



6

www.somedomain.com є доменом / хостом. Субдомен є важливою частиною. www.часто використовується взаємозамінно з відсутністю, але це має бути встановлено як правило (навіть якщо воно встановлено за замовчуванням), оскільки вони не є рівнозначними. Подумайте про інший субдомен, наприклад mx.. Це, мабуть, має іншу ціль, ніж www..

Враховуючи це, я б радив не робити подібних речей. Тим не менш, оскільки ви запитуєте, я думаю, у вас є поважна причина.

Особисто я б запропонував спеціальний корпус www.для цього.

string host = HttpContext.Current.Request.Url.GetComponents(UriComponents.HostAndPort, UriFormat.Unescaped);;

if (host.StartsWith("www."))
    return host.Substring(4);
else
    return host;

В іншому випадку, якщо ви дійсно на 100% впевнені, що хочете відрубати будь-який субдомен, вам знадобиться щось трохи складніше.

string host = ...;

int lastDot = host.LastIndexOf('.');

int secondToLastDot = host.Substring(0, lastDot).LastIndexOf('.');

if (secondToLastDot > -1)
    return host.Substring(secondToLastDot + 1);
else
    return host;

Отримати порт так само, як казали інші люди.


1

HttpContext.Current.Request.Url.Host повертає правильні значення. Якщо ви запустите його на www.somedomainname.com, це дасть вам www.somedomainname.com. Якщо ви хочете отримати і 5858, вам потрібно скористатися

HttpContext.Current.Request.Url.Port 

1

Request.ServerVariablesоб'єкт працює для мене. Я не знаю жодної причини, щоб не використовувати його.

ServerVariables["SERVER_NAME"]і ServerVariables["HTTP_URL"]повинні отримати те, що ви шукаєте


1

Ви можете спробувати такий код, щоб отримати повне доменне ім’я:

Request.Url.Scheme + System.Uri.SchemeDelimiter + Request.Url.Host

4
Незважаючи на те, що цей фрагмент коду може вирішити питання, включення пояснення дійсно допомагає поліпшити якість вашої публікації. Пам’ятайте, що ви будете відповідати на запитання для читачів у майбутньому, і ці люди можуть не знати причин вашої пропозиції коду.
Dr Rob Lang

1

Ось швидкий простий спосіб просто отримати назву URL-адреси.

            var urlHost = HttpContext.Current.Request.Url.Host;

            var xUrlHost = urlHost.Split('.');
            foreach(var thing in xUrlHost)
            {
                if(thing != "www" && thing != "com")
                {
                    urlHost = thing;
                }
            }


0

Щоб отримати базову URL-адресу в MVC, навіть із субдоменом www.somedomain.com/subdomain:

var url = $"{Request.Url.GetLeftPart(UriPartial.Authority)}{Url.Content("~/")}";

0

Я використовую це так у asp.net core 3.1

 var url =Request.Scheme+"://"+ Request.Host.Value;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.