Как получить текущее доменное имя в 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
Имя хоста и имя домена - это две разные вещи. Вам нужен домен, который сопоставлен с вашим конкретным IP-адресом или именем хоста компьютера, на котором он работает?
— Роб Гудвин


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

Ответы:


81

Использование Request.Url.Hostуместно - это способ получения значения HTTP- Host:заголовка, который указывает, какое имя хоста (доменное имя) хочет 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), является красной селедкой.


121

Попробуйте получить «левую часть» URL-адреса, например:

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

Это даст вам либо http://localhost:5858или https://www.somedomainname.comвы на местном или производстве ли. Если вы хотите отбросить wwwчасть, вам следует настроить IIS для этого, но это уже другая тема.

Обратите внимание, что полученный URL-адрес не будет иметь косой черты в конце.


7
На мой взгляд, это должен быть лучший ответ.
— Эндрю

Это отлично сработало для моих нужд. Однако одно небольшое исправление: при запросе части Authority возвращаемая строка не будет включать конечный разделитель пути. Таким образом:http://localhost:60333
— Will

1
var base_url = "@ Request.Url.GetLeftPart (UriPartial.Authority) @ Url.Content (" ~ / ")"
— Prince Prasad

1
Похоже, это не работает на Asp.Net Core 2.2. Я получаю, что «HttpContext» не содержит определения для «Current», и не может быть найден доступный метод расширения «Current», принимающий первый аргумент типа «HttpContext» (вам не хватает директивы using или ссылки на сборку?).
— Stian

@Stian По-видимому, на это уже есть ответ: stackoverflow.com/questions/31243068/… . Эти ответы сосредоточены только на части URI.
— Артуро Торрес Санчес

42

Вот скриншот 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
Хотя этот фрагмент кода может решить вопрос, включение объяснения действительно помогает улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос читателей в будущем, и эти люди могут не знать причин вашего предложения кода.
— Д-р Роб Ланг,

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

Попробуй это:

@ Request.Url.GetLeftPart (UriPartial.Authority)


В этом ответе не уточняется, почему это работает, и фактически он идентичен одному из существующих ответов.
— Arturo Torres Sánchez

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.